分配值时,[]和[:]之间有什么区别?

时间:2013-03-04 12:46:34

标签: python variable-assignment slice

我碰巧看到了这段代码:

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

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

似乎a[:]赋值指定了一个指针,但我无法找到有关该指针的文档。所以任何人都可以给我一个明确的解释?

3 个答案:

答案 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]
>>>