簡體   English   中英

list和list [:]在python中有什么區別?

[英]What is the difference between list and list[:] in python?

什么,如果有的話,是python中listlist[:]之間的區別?

讀取時, list是對原始列表的引用, list[:]淺表復制列表。

分配時, list (重新)綁定名稱並list[:] slice-assigns,替換先前列表中的內容。

此外,不要使用list作為名稱,因為它會影響內置。

后者是對列表副本的引用,而不是對列表的引用。 所以它非常有用。

>>> li = [1,2,3]
>>> li2 = li
>>> li3 = li[:]
>>> li2[0] = 0
>>> li
[0, 2, 3]
>>> li3
[1, 2, 3]

li [:]創建原始列表的副本。 但它沒有引用相同的列表對象。 因此,您無需通過更改li [:]創建的副本來更改原始列表。

例如:

>>> list1 = [1,2,3]
>>> list2 = list1
>>> list3 = list1[:]
>>> list1[0] = 4
>>> list2
[4, 2, 3]
>>> list3
[1, 2, 3]

這里通過更改list1來更改list2 ,但list3不會更改。

要將第一個list應用於變量,將創建對原始列表的引用。 第二個list[i]將創建一個淺表副本。

例如:

foo = [1,2,3]
bar = foo
foo[0] = 4

bar和foo現在將是:

[4,2,3]

但:

foo = [1,2,3]
bar = foo[:]
foo[0] = 4

結果將是:

bar == [1,2,3]
foo == [4,2,3]

:是切片。

但是,如果列表元素本身就是列表,那么即使list1 = list[:]也存在問題。 考慮:

>>> a = [[1,2,3],[4,5,6],[7,8,9]]
>>> b = a[:]
>>> b[0].remove(2)
>>> b 
[[1, 3], [4, 5, 6], [7, 8, 9]]
>>> a
[[1, 3], [4, 5, 6], [7, 8, 9]]

發生這種情況是因為復制到b的每個列表元素本身就是一個列表,這種列表復制涉及與普通list1 = list2相同的問題。 我發現的最短路徑是以這種方式顯式復制每個列表元素:

>>> a = [[1,2,3],[4,5,6],[7,8,9]]
>>> b=[[j for j in i] for i in a]   
>>> b
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> b[0].remove(2)
>>> b
[[1, 3], [4, 5, 6], [7, 8, 9]]
>>> a
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

當然,在嵌套表嵌套每增加一個等級,復制代碼深化了額外的內嵌for循環。

第一個引用原始列表。 第二個指向原始列表的副本。
看一下這個!

>>> a = [1, 2, 3]
>>> b = a
>>> c = a[:]
>>> a == b
True
>>> a is b
True
>>> a == c
True
>>> a is c
False
>>> a.__repr__
<method-wrapper '__repr__' of list object at 0x7f87a9ba3688>
>>> a.__repr__()
'[1, 2, 3]'
>>> b.__repr__
<method-wrapper '__repr__' of list object at 0x7f87a9ba3688>
>>> c.__repr__
<method-wrapper '__repr__' of list object at 0x7f87ad352988>

請注意, ab都指向地址0x7f87a9ba3688,c指向0x7f87ad352988
差異非常明顯。
ab都引用原始列表對象。
然而, c指向(原始列表的)副本,因此,它位於不同的位置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM