a[]和a[:]在赋值时有什么区别?

4 投票
3 回答
1524 浏览
提问于 2025-04-17 17:52

我偶然看到了一段代码:

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的那个列表,而在第二个例子中,它指向的是它自己,形成了一个递归结构。

如果你对这个理解有困难,我建议你看看这个可视化工具

撰写回答