为什么Python第二次创建类实例时默认参数值会被保留?
问题原因
这个问题是Python里对象类型默认函数参数的求值特性导致的:Python的函数默认参数是在函数定义阶段完成求值的,不是每次调用函数的时候重新生成。
你写的Friend.__init__方法里默认参数是user = User(),这行代码只会在类定义的时候执行一次,生成唯一的一个User实例,所有没有传user参数创建的Friend实例,都会共享这同一个User对象。所以你修改friend_1绑定的User对象的name值,friend_2绑定的其实是同一个对象,自然读取到的就是修改后的值。
修复方案
把默认参数设为None,在函数内部每次调用的时候再创建User实例即可,修改后的Friend类代码如下:
class Friend: def __init__(self,user = None): # 每次调用__init__的时候,如果没传user就新建一个User实例 if user is None: user = User() self.__user = user def get_user(self): return self.__user.get_name() def set_n(self,name): self.__user.set_name(name)
修改后创建friend_2的时候就会生成全新的User实例,读取到的name值就是预期的Empty name。
内容的提问来源于stack exchange,提问作者NNikN
相关产品推荐
相关产品推荐

