我碰巧看到了这段代码:
a = []
a = [a, a, None]
# makes a = [ [], [], None] when print
a = []
a[:] = [a, a, None]
# makes a = [ [...], [...], None] when print
似乎a[:]
赋值指定了一个指针,但我无法找到有关该指针的文档。所以任何人都可以给我一个明确的解释?
答案 0 :(得分:7)
在Python中,a
是一个名称 - 它指向一个对象,在本例中是一个列表。
在您的第一个示例中,a
最初指向空列表,然后指向新列表。
在第二个示例中,a
指向一个空列表,然后更新以包含新列表中的值。这不会更改列表a
引用。
最终结果的差异在于,首先评估操作的右侧,在这两种情况下,a
都指向原始列表。这意味着在第一种情况下,它指向曾经是a
的列表,而在第二种情况下,它指向自身,形成一个递归结构。
如果您无法理解这一点,我建议您查看it visualized。
答案 1 :(得分:7)
第一个会将a
指向新对象,第二个会突变a
,因此a
引用的列表仍然相同。
例如:
a = [1, 2, 3]
b = a
print b # [1, 2, 3]
a[:] = [3, 2, 1]
print b # [3, 2, 1]
a = [1, 2, 3]
#b still references to the old list
print b # [3, 2, 1]
答案 2 :(得分:0)
来自@pythonm响应的更明确的例子
>>> a=[1,2,3,4]
>>> b=a
>>> c=a[:]
>>> a.pop()
4
>>> a
[1, 2, 3]
>>> b
[1, 2, 3]
>>> c
[1, 2, 3, 4]
>>>