Python中__init__内列表变量引用重叠问题求助
解决Python列表实例变量同步修改的问题
你遇到的问题本质是列表是可变对象,直接赋值只是传递引用,不是创建新的副本。当执行self.b = self.a时,self.b并没有生成新的列表,而是和self.a指向内存里同一个列表对象。后续修改self.a的元素时,self.b因为指向同一个对象,自然会同步变化。你之前尝试的中间变量赋值,本质还是传递引用,所以无法解决问题。
看你的代码:第一次调用func时,self.a变成[1,0],此时self.b还是初始化的[0,0],所以self.a == self.b返回False;但执行self.b = self.a后,self.b就和self.a绑定到同一个列表了。第二次调用func修改self.a[0]时,self.b会跟着变化,此时self.a == self.b就会返回True。
修正方案:给列表创建副本
要解决这个问题,需要给self.b赋值self.a的独立副本,而不是直接引用。常用三种方法:
- 切片创建副本
class A: def __init__(self): self.a = [0,0] self.b = [0,0] def func(self): self.a[0] += 1 print(self.a,self.b,self.a == self.b) # 按预期返回False self.b = self.a[:] # 用切片生成新列表副本 run = A() for i in range(10): run.func()
list()构造函数创建副本
把self.b = self.a[:]替换成self.b = list(self.a),效果完全一致。copy模块创建副本
先导入copy模块,再用copy.copy()生成副本,这种方法适用于更多可变对象类型:
import copy class A: def __init__(self): self.a = [0,0] self.b = [0,0] def func(self): self.a[0] += 1 print(self.a,self.b,self.a == self.b) self.b = copy.copy(self.a) run = A() for i in range(10): run.func()
内容的提问来源于stack exchange,提问作者Need_help
相关产品推荐
相关产品推荐

