Python中append()是复制参数还是添加引用?赋值None后ID为何不同?
Python列表引用与变量赋值问题解析
实验代码
class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right a = [] b = TreeNode(1) a.append(b) b = None print(id(a[0])) # 140103806472096 print(id(b)) # 9520032
问题解答
1. 赋值b = None后,a[0]和b分别发生了什么?
- 变量
b的变化:Python里的变量本质是指向对象的"引用指针"。原本b指向创建的TreeNode(1)对象,执行b = None后,b不再关联原TreeNode对象,转而指向None这个特殊对象,因此id(b)会变成None的内存地址。 a[0]的变化:列表a执行append(b)时,是把b当时指向的TreeNode对象的引用存入了列表。这个列表内的引用和变量b是独立的,修改b的指向不会影响列表里的引用。所以a[0]依然指向原来的TreeNode(1)对象,id(a[0])保持原TreeNode的内存地址,且原对象不会被垃圾回收(因为还有a[0]在引用它)。
2. 为什么append()是添加引用而非复制,但两者ID不同且a[0]仍存储原TreeNode?
append()确实是添加对象的引用而非复制对象,但核心逻辑是:变量b和列表中的引用是两个独立的引用。可以类比成,b是一个贴在TreeNode对象上的标签,append(b)是把这个标签复制一份贴到列表里。当你把b这个标签撕下来贴到None上时,列表里的标签副本还留在原TreeNode对象上,完全不受影响。所以此时b指向None,a[0]指向原TreeNode,两者的ID自然不同,a[0]也依然能访问原TreeNode对象。
内容的提问来源于stack exchange,提问作者Lucius
相关产品推荐
相关产品推荐

