python - 为什么为第二个实例调用保留默认参数?
问题描述
当我执行下面的代码时,第一次打印名称值时,它会打印正确的名称,即“John”。
但是当我创建第二个空实例时,它仍然会打印名称“John”。预期的输出应该是,它只会打印“空名称”,因为friend_2使用了一个新的空实例。
class User:
def __init__(self,name ="Empty name"):
self.__name = name
def get_name(self):
return self.__name
def set_name(self,word):
self.__name = word
class Friend:
def __init__(self,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_1 = Friend()
# Only friendd_1 instance is being set to name John
friend_1.set_n("John")
name_1 = friend_1.get_user() # expected as we set John to friend_1 instance
friend_2 = Friend() # use new User empty instance
name_2 = friend_2.get_user() # This value is also John, but it should print "Empty value" as we are using default argument.
解决方案
正如评论中所述,可变默认参数是一个常见的问题。
class Friend:
def __init__(self, user = None):
# Default to None instead and then create the object during initialization
self.__user = user if user else User()
推荐阅读
- redux - React / Redux:导航到详细信息视图时的单一事实来源
- html - Shopify 页面在移动设备和桌面设备上的显示方式不同
- r - 将布尔帧转换为R中的因子
- javascript - 如何在javascript中的2个模式之间拆分字符串
- oracle - 在oracle中查询最后一天的所有数据
- java - Project Reactor 和 Java 内存模型
- django - 无法启动 docker 项目
- sql-server - sys.fn_get_audit_file 一次可以读取多少个sql审计文件?
- azure-cosmosdb - 架构编辑器集合采样缺少字段
- terminal - 让 WSL shell 在 Windows Visual Studio Code 中打开项目目录