4

我碰巧看到了这段代码:

a = []  
a = [a, a, None]
# makes a = [ [], [], None] when print

a = []
a[:] = [a, a, None]
# makes a = [ [...], [...], None] when print

似乎a[:]分配分配了一个指针,但我找不到有关它的文档。所以有人可以给我一个明确的解释吗?

4

3 回答 3

7

在 Python 中,a是一个名称——它指向一个对象,在本例中是一个列表。

在您的第一个示例中,a最初指向空列表,然后指向新列表。

在您的第二个示例中,a指向一个空列表,然后将其更新为包含新列表中的值。这不会更改列表a引用。

最终结果的不同之处在于,由于首先评估操作的右侧,因此在两种情况下都a指向原始列表。这意味着在第一种情况下,它指向曾经是的列表a,而在第二种情况下,它指向自身,形成一个递归结构。

如果您无法理解这一点,我建议您将其可视化

于 2013-03-04T12:51:11.013 回答
7

第一个将指向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]
于 2013-03-04T12:51:27.360 回答
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]
>>> 
于 2013-03-04T16:24:28.387 回答