为何向嵌套列表中的列表执行append后原列表也被修改?
问题核心:Python的可变对象与引用机制
先看你贴的代码:
list = [1,2,3,4] for x in [list]: # 这里是把原列表放进了一个新列表里 x.append(2) print(x) print(list)
你疑惑的点在于:明明没直接改list,它却跟着变了——本质是Python里的可变对象(比如列表、字典),变量和容器存储的都是对象的引用,而不是对象本身。
具体拆解代码逻辑:
- 第一行
list = [1,2,3,4]:在内存里创建了一个列表对象[1,2,3,4],变量list存的是这个对象的内存地址(引用)。 - 第二行
for x in [list]:这里创建了一个新列表,里面的元素不是原列表的复制版,而是直接把list的引用放进去了。也就是说,新列表里的元素和list指向的是同一个内存里的列表对象。 - 循环里
x.append(2):x拿到的是那个引用,调用append是直接操作它指向的原列表对象——相当于你用两把钥匙开同一扇门,用x这把钥匙开门加了个元素,用list这把钥匙开门自然也能看到变化。 - 最后打印时,
x和list都指向同一个修改后的列表,所以输出完全一致。
补充个对比,要是换成不可变对象(比如字符串),结果就不一样:
s = "hello" for x in [s]: x = x + " world" print(x) # 输出 hello world print(s) # 输出 hello
因为字符串是不可变的,x = x + " world"不是修改原对象,而是生成了一个新的字符串对象,x转而指向新对象,但s还是指向原来的字符串,所以原变量不会变。
内容的提问来源于stack exchange,提问作者ceramics.2
相关产品推荐
相关产品推荐

