【发布时间】:2020-11-17 03:21:58
【问题描述】:
我是 Python 新手,我有一个类似的类:
class UserInfo():
def __init__(self):
self.level = 1
self.type = 'A'
self.info = {
'name ' : 'John',
'age ' : 20,
'gender ' : 'Male',
'job' : 'student',
}
def getInfo(self):
return self.info
等等……
然后我创建一个类的实例:
ui = UserInfo()
# display original class info
print(ui.getInfo())
# {
# 'name ' : 'John',
# 'age ' : 20,
# 'gender ' : 'Male',
# 'job' : 'student',
# }
myinfo = ui.getInfo()
# change "myinfo"
myinfo.update({
'name ' : 'May',
'age ' : 18,
'gender ' : 'Female',
'job' : 'lecturer',
})
但是当我再次尝试显示原始班级信息时,我得到:
print(ui.getInfo())
# {
# 'name ' : 'May',
# 'age ' : 18,
# 'gender ' : 'Female',
# 'job' : 'lecturer',
# }
我期待的是
print(myinfo)
# {
# 'name ' : 'May',
# 'age ' : 18,
# 'gender ' : 'Female',
# 'job' : 'lecturer',
# }
print(ui.getInfo())
# {
# 'name ' : 'John',
# 'age ' : 20,
# 'gender ' : 'Male',
# 'job' : 'student',
# }
为什么我更新myinfo 但它也改变了类的值?
如何避免这种情况?我只想修改myinfo
编辑 1:
感谢大家回答了我的问题。
我刚刚尝试使用return self.info.copy()
当我尝试做myinfo.update
但是现在我有另一个问题,当我的字典包含另一个字典时,如果我尝试编辑里面的字典,它就不能再工作了:
class UserInfo():
def __init__(self):
self.level = 1
self.type = 'A'
self.info = {
'name ' : 'John',
'age ' : 20,
'gender ' : 'Male',
'job' : 'student',
'favorite' : {
'food' : 'pizza',
'sport' : 'badminton',
'game' : 'none',
},
}
def getInfo(self):
return self.info.copy()
ui = UserInfo()
print(ui.getInfo())
# {
# 'name ': 'John',
# 'age ': 20,
# 'gender ': 'Male',
# 'job': 'student',
# 'favorite': {
# 'food': 'pizza',
# 'sport': 'badminton',
# 'game': 'none'
# }
#}
myinfo = ui.getInfo()
myinfo['favorite'].update({'game' : 'mobile'})
print(ui.getInfo())
# {
# 'name ': 'John',
# 'age ': 20,
# 'gender ': 'Male',
# 'job': 'student',
# 'favorite': {
# 'food': 'pizza',
# 'sport': 'badminton',
# 'game': 'mobile'
# }
# }
【问题讨论】:
-
... 因为
update就地改变了字典,而您的实例属性info仍然指的是同一个字典对象。你可以把getInfo写成return self.info.copy() -
感谢您的回复。当我做
myinfo.update时,它与返回.copy()工作正常,但是当字典包含另一个字典时,它不再工作(我已经编辑了我的帖子) -
因为在这种情况下您需要创建一个深拷贝。最好的解决方案是不要围绕这样的可变状态设计程序
-
@juanpa.arrivillaga 哦,我明白了,我会再次查看我的代码,非常感谢您的回复!
标签: python function class return