我无法解释以下行为:
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]
似乎是l1[:][0]
指的是副本,而l1[:]
指的是对象本身。
答案 0 :(得分:13)
这是由python的功能引起的,它允许你将列表分配给另一个列表,即
l1 = [1,2,3,4]
l1[:2] = [9, 8]
print(l1)
将l1
的前两个值分别设置为9
和8
。类似地,
l1[:] = [9, 8, 7, 6]
为l1
的所有元素指定新值。
有关the docs中作业的详细信息。
答案 1 :(得分:7)
l1[:][0] = 888
首先获取l1
(l1[:]
)中所有元素的片段,其中(根据列表语义)返回包含{{1}中所有对象的新列表对象这是l1
的浅表副本。
然后用整数l1
(888
)替换该复制列表的第一个元素。
然后,复制的列表将被丢弃,因为没有任何操作。
您的第二个示例[0] = 888
将l1[:] = [9, 8, 7, 6]
中的所有元素替换为列表l1
中的所有元素。这是一个切片分配。