我无法解释以下行为:
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[:]
则是对对象本身的引用。
这是由Python的特性引起的,该特性允许您将一个列表分配给另一个列表的切片,即
l1 = [1,2,3,4]
l1[:2] = [9, 8]
print(l1)
将会把 l1
的前两个值分别设置为 9
和 8
。同样地,
l1[:] = [9, 8, 7, 6]
为l1
的所有元素赋予新值。
更多有关赋值的信息,请参考文档。
l1[:][0] = 888
首先对 l1
中的所有元素进行切片 (l1[:]
),这将返回一个新的列表对象,其中包含 l1
中的所有对象-- 它是 l1
的浅拷贝。
然后,它用整数 888
替换该复制列表的第一个元素 ([0] = 888
)。
然后,被复制的列表被丢弃,因为没有使用它。
您的第二个示例 l1[:] = [9, 8, 7, 6]
替换 l1
中的所有元素为列表 [9, 8, 7, 6]
。这是一次切片赋值。
l1
,除非它是一个赋值操作的目标(你的第二个例子),在这种情况下,它只是替换 l1
的整个内容。 - Max Noel