Python中如何修改变量值而不影响同内存引用的另一个变量
问题本质
Python中赋值语句不会复制对象,只会为现有对象绑定新的变量名。当你执行y = x操作时,若x是列表这类可变对象,x和y会指向内存中完全相同的列表实例,对y的元素做原地修改时,本质是修改这个共享的列表对象,因此x对应的内容也会同步变化。
数字类型无联动的原因
数字、字符串、元组属于不可变对象,不存在原地修改的可能,所有看似“修改”这类变量的操作,本质都是将变量绑定到一个新创建的对象上,自然不会影响绑定到原对象的其他变量。
实现修改y不改动x的方案
你需要为原列表创建独立的副本,再将副本赋值给y,根据列表结构可以选择不同的拷贝方式:
- 一维列表场景(无嵌套可变对象),任选以下一种写法即可:
- 切片法(写法最简洁):
x = [2,3,4,5,8] y = x[:] y[2] = 10 print(y) # 输出 [2,3,10,5,8] print(x) # 输出 [2,3,4,5,8],不受修改影响 - 列表构造法:
y = list(x) - copy模块浅拷贝:
import copy y = copy.copy(x)
- 切片法(写法最简洁):
注意:以上三种均为浅拷贝,仅复制了最外层列表,如果列表中嵌套了列表、字典这类可变对象,嵌套层的内容仍然是共享引用的。如果要处理嵌套结构,需要使用深拷贝递归复制所有层级的对象,此时无论怎么修改
y都不会影响x:import copy y = copy.deepcopy(x)
内容的提问来源于stack exchange,提问作者Amr
相关产品推荐
相关产品推荐

