我碰巧看到了这段代码:
a = []
a = [a, a, None]
# makes a = [ [], [], None] when print
a = []
a[:] = [a, a, None]
# makes a = [ [...], [...], None] when print
似乎a[:]
分配分配了一个指针,但我找不到有关它的文档。所以有人可以给我一个明确的解释吗?
我碰巧看到了这段代码:
a = []
a = [a, a, None]
# makes a = [ [], [], None] when print
a = []
a[:] = [a, a, None]
# makes a = [ [...], [...], None] when print
似乎a[:]
分配分配了一个指针,但我找不到有关它的文档。所以有人可以给我一个明确的解释吗?
在 Python 中,a
是一个名称——它指向一个对象,在本例中是一个列表。
在您的第一个示例中,a
最初指向空列表,然后指向新列表。
在您的第二个示例中,a
指向一个空列表,然后将其更新为包含新列表中的值。这不会更改列表a
引用。
最终结果的不同之处在于,由于首先评估操作的右侧,因此在两种情况下都a
指向原始列表。这意味着在第一种情况下,它指向曾经是的列表a
,而在第二种情况下,它指向自身,形成一个递归结构。
如果您无法理解这一点,我建议您将其可视化。
第一个将指向a
一个新对象,第二个将 mutate 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]
来自@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]
>>>