Python:列出和复制它们

fcr*_*r79 11 python list

我无法解释以下行为:

l1 = [1, 2, 3, 4]
l1[:][0] = 888
print(l1) # [1, 2, 3, 4]
l1[:] = [9, 8, 7, 6]
print(l1) # [9, 8, 7, 6]
Run Code Online (Sandbox Code Playgroud)

它似乎是l1[:][0]指副本,而是l1[:]指对象本身.

Ara*_*Fey 13

这是由python的功能引起的,它允许您将列表分配给另一个列表的切片,即

l1 = [1,2,3,4]
l1[:2] = [9, 8]
print(l1)
Run Code Online (Sandbox Code Playgroud)

将设置l1的前两个值到98分别.同样的,

l1[:] = [9, 8, 7, 6]
Run Code Online (Sandbox Code Playgroud)

为所有元素分配新值l1.


有关文档中的分配的更多信息.


Max*_*oel 7

l1[:][0] = 888首先获取l1(l1[:])中所有元素的切片,其中(按照列表语义)返回一个包含所有对象的新列表对象l1- 它是一个浅表副本l1.

然后它用integer 888([0] = 888)替换该复制列表的第一个元素.

然后,复制的列表将被丢弃,因为没有任何操作.

您的第二个示例l1[:] = [9, 8, 7, 6] 所有元素替换l1为列表中的元素[9, 8, 7, 6].这是一个切片分配.