我被要求進行編碼測試,但不知道答案。有人有主意嗎?[:] = b和a = b [:]之間的區別? (Python)
回答
[:]
是切片運算符。
當它位於左側時,它會覆蓋列表的內容而不創建新的引用。
當它在右側時,它會創建一個具有相同內容的列表副本。
哦,好吧,現在有道理。爲了澄清,在做一個[:] = b時,id(a)不會改變。 id(a)在執行a = b [:]時發生變化。爲什麼一個人可能比另一個更好? – user701632
是的,你明白了。如果'c'也引用與'a'相同的列表,那麼您可能需要更改內容,以便兩個變量都引用更新後的列表。 – recursive
在這兩種情況下,最終列表a
是列表b
的副本。但用於實現這一點的方法已經改變。
a[:] = b
修改列表a
,使其具有相同的元素b
a = b[:]
產生一個新的列表,它是b
副本,並替換列表a
所不同的是,我們是否已經修改現有的列表或創建一個新的列表。
要看到其中的差別:
a = range(3)
b = range(4)
c = a # c and a now share the same list
a[:] = b
print "a", a
print "b", b
print "C", c
所有三個列表將打印出來的一樣。 C和一個共享相同的對象,所以,當a
被修改,以便爲c
a = range(3)
b = range(4)
c = a # c and a now share the same list
a = b[:]
print "a", a
print "b", b
print "C", c
現在Ç不會打印出相同的。作業後,a
和c
沒有共享同一個對象。
快速,a[:] = b' is probably a little faster then
a = b [:]`。第一種形式不必創建新的列表對象,它只能修改現有的列表。其中很大一部分是它可以重新使用列表已經擁有的內存,而不是分配新的內存。
a = b[:]
呼叫或者在b
__getslice__
或__getitem__
並將結果a
分配。在幾乎所有情況下(例如,列表,元組和其他序列類型),這會生成序列的淺表副本;我不知道任何沒有實現這種行爲的類,但是你可以有一個用戶定義的類型來做一些不同的事情。之前提到舊值a
的任何其他對象將繼續引用舊值。
a[:] = b
,在另一方面,來電__setslice__
或__setitem__
取代的a
與那些序列b
的元素的子集。在這種情況下,如果a
的序列類型表現良好,則將替換整個a
,因爲沒有端點的範圍:
表示整個序列。這裏的區別是,不可變類型(如元組)不會允許您執行__setslice__
(例如通過拋出TypeError
異常)。由於底層對象正在被修改,因此之前提到a
的任何其他對象也將被更新。
對於可變類型如list
,的a = b[:]
結果將是相同的a[:] = b
,在a
將是b
淺表副本;對於不可變類型,如tuple
,a[:] = b
無效。對於糟糕的用戶定義類型,所有投注都關閉。其他對象引用a
- 與a = b[:]
相同,它們指的是原始值(a
),但a[:] = b
指向修改後的對象(b
的淺拷貝)。
- 1. a + b和.__之間的區別__(b)
- 2. a + = b和a = + b之間的區別是什麼,a ++和++ a?
- 3. a = a ||之間的區別b和a || = B
- 4. a = a + b和a + = b之間的區別是什麼?
- 5. ||之間的區別a = b和a = a || b在紅寶石?
- 6. bash中的$ [a-b]和$((a-b))之間的區別
- 7. Kleene明星在編程。 (a | b)*和a * b *之間的區別?
- 8. * a = b和a =&b之間的區別是什麼?
- 9. Scala中f(a,b)和f(a)(b)之間的區別
- 10. a [:] = b和a = b之間的區別是什麼?
- 11. 在PHP OOP中$ a =&$ b,$ a = $ b和$ a = clone $ b之間的區別OOP
- 12. [abc]和(a | b | c)之間的區別
- 13. a // b和int(a/b)之間有什麼區別?
- 14. (a不在b)與(不在b中)之間的區別。 Python
- 15. 區別 「A級; B類」 和 「類A :: B」
- 16. Python中a - = b和a = a - b的區別
- 17. a,b = b,a + b和a = b,b = a + b在fibonacci中的區別是什麼[Python]
- 18. * a = b和a =&b之間的差異?
- 19. double a = a + int b和int a + = double b之間的區別是什麼?
- 20. d.update(dict(a = 1,b = 2))和d.update(dict('a'= 1,'b'= 2)之間有什麼區別)
- 21. Python a,b = b,a + b
- 22. 未定義的引用 - 應該在C++中的`a = -b;`和`a = -1 * b;`和`a = 0-b'之間有區別嗎?
- 23. val b = a(a是一個Array)和val b = a.clone()之間的區別是什麼?
- 24. MySQL:`... ADD INDEX(a);之間的區別... ADD INDEX(b);`和`... ADD INDEX(a,b);`?
- 25. A == B對B == A,有什麼區別
- 26. Java中a + = b和a = a + b的區別
- 27. 爲什麼有A = A +之間的差異B和A + = B
- 28. [b] [b = a,0]如何在a和b之間交換?
- 29. Ruby中的object.method(a,b)和方法(a,b)有什麼區別
- 30. MatLab中的[A,B]和[A; B]有什麼區別?
可能重複[在Python中列表和列表\ [:\]有什麼區別?](http://stackoverflow.com/questions/4081561/what-is-the-difference-between-list-and -list-in-python) –
@Ignacio:不,這不是重複的 - 該問題沒有提到'a [:] = b'構造。 –
@Adam:甚至沒有開始的部分「分配...時」? –