Python中向列表追加空列表为何出现旧元素?列表引用疑问
Python列表引用机制问题解析
先还原完整操作序列:
>>> A=[]; B=[] >>> A.append(1) >>> A [1] >>> A=[] >>> A [] >>> B.append(A) >>> B [[]] # 继续操作 >>> A.append(1) >>> A [1] >>> A=[] >>> A [] >>> B.append(A) >>> B [[1], []]
核心原因:Python变量存的是对象引用,而非对象本身
列表是Python中的可变对象,变量名只是指向内存中对象的"指针",不是存储对象本身。一步步拆解操作:
- 执行
A=[]时,创建了第一个空列表(记为「列表X」),A指向X;A.append(1)把X改成了[1]。 - 再次执行
A=[]时,创建了第二个空列表(记为「列表Y」),此时A的指向从X切换到Y,X会被Python垃圾回收机制清理。 B.append(A)是把Y的引用加入B,所以B此时是[Y],打印显示[[]]。- 后续
A.append(1)是对当前A指向的Y进行修改,Y从[]变成[1]——而B里的第一个元素就是Y的引用,所以B的第一个元素会同步变成[1]。 - 最后一次
A=[]创建了第三个空列表(记为「列表Z」),A指向Z;B.append(A)把Z的引用加入B,所以B最终是[Y, Z],对应显示[[1], []]。
对你疑问的解答:
- 你看到的
1存储在「列表Y」里,这个列表就是你第一次追加到B中的那个空列表,后来通过A的引用被修改了。 - 第二次追加到B里的确实是空列表Z,但第一次追加的Y已经被改成了
[1],所以B的结果才是[[1], []]。
内容的提问来源于stack exchange,提问作者Orla
相关产品推荐
相关产品推荐

