Python类实例修改变量后其他实例同步更新?原因解析
为什么两个Agent实例的info会同步更新?
这是Python里可变默认参数的经典坑,根源一句话就能说清:类方法的可变默认参数,是在定义方法的时候创建的,不是每次实例化时新建的。
具体拆解一下过程:
- 当你写完
class Agent:这段代码并运行时,Python会立刻处理类里的所有定义,包括__init__方法的默认参数info=dict()——这时候一个空字典就已经被创建出来了,它会一直绑定在Agent.__init__这个方法上,相当于一个“公共变量”。 - 当你创建
a1 = Agent(1)时,因为没传info参数,self.info直接指向了这个提前建好的公共字典。 - 再创建
a2 = Agent(2)时,同样没传info,self.info也指向同一个公共字典。 - 所以不管是a1还是a2修改
info里的内容,本质都是在操作同一个字典对象,自然会互相同步。
打个生活化的比方:公司前台放了一本公共的访客登记本,规定“没带自己本子的人都用这本”。a1和a2都没带本子,所以都用这本公共本——a1在上面写了内容,a2翻开看自然也是一样的,因为他俩用的根本就是同一本书。
标准的解决办法是把默认参数设为不可变的None,然后在方法内部创建新的可变对象:
class Agent: def __init__(self, id:int, info=None) -> None: self.id = id self.info = info if info is not None else dict()
这样每次实例化时,如果没传info,就会新建一个空字典,每个实例的info都是独立的,不会再互相影响。
内容的提问来源于stack exchange,提问作者Palmy
相关产品推荐
相关产品推荐

