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

can*_*an. 4 python variable-assignment slice

我碰巧看到这段代码:

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

a = []
a[:] = [a, a, None]
# makes a = [ [...], [...], None] when print
Run Code Online (Sandbox Code Playgroud)

看来这个a[:]赋值指定了一个指针,但我找不到有关它的文档.所以任何人都可以给我一个明确的解释?

Gar*_*tty 7

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

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

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

最终结果的差异在于,首先评估操作的右侧,在两种情况下,都a指向原始列表.这意味着在第一种情况下,它指向以前的列表a,而在第二种情况下,它指向自身,形成递归结构.

如果您无法理解这一点,我建议您看一下它的可视化.


lol*_*pop 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]
Run Code Online (Sandbox Code Playgroud)