a[]和a[:]在赋值时有什么区别?
我偶然看到了一段代码:
a = []
a = [a, a, None]
# makes a = [ [], [], None] when print
a = []
a[:] = [a, a, None]
# makes a = [ [...], [...], None] when print
看起来这个 a[:]
的赋值是给一个指针,但我找不到相关的文档。有人能给我详细解释一下吗?
3 个回答
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]
>>>
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]
7
在Python中,a
是一个名字,它指向一个对象,这里指的是一个列表。
在你的第一个例子中,a
最开始指向一个空列表,然后又指向了一个新的列表。
在你的第二个例子中,a
指向一个空列表,然后它被更新为包含新列表中的值。这并没有改变a
所指向的列表。
最终结果的不同在于,因为操作的右边部分会先被计算,所以在这两种情况下,a
都指向原来的列表。这意味着在第一个例子中,它指向的是曾经是a
的那个列表,而在第二个例子中,它指向的是它自己,形成了一个递归结构。
如果你对这个理解有困难,我建议你看看这个可视化工具。