我在使用字典时遇到了一些问题,字典是Python中的类变量。我想要一个dict类变量(一个模板(,它被添加到每个实例(用户(中,然后每个实例都可以独立地更改它们的dict值。然而,我的经验是,在一个实例中更改dict值也会更改模板Class变量和所有其他实例的dict值。integer类型的变量不是这样的,所以我很好奇为什么dicts作为类变量会表现出这种行为?
为了说明,我在下面组装了一个示例代码,其中我有两个用户,他们(在初始化时(被分配";他们自己的";词典当向用户添加值时,该字典由模板dict填充,以便用户可以相互独立地修改值。或者,至少这是它应该举例说明的。
class User:
template = {"sad": 0, "happy": 0, "meloncoli": 0}
def __init__(self):
self.emo = {}
def new_dict(self, user_input):
# add the template to the current instance
self.emo = self.template
# if the input values (strings) are in the template, then add 1 instead of 0 as value.
for i in range(len(list(user_input.values())[0])):
if list(user_input.values())[0][i] in self.emo:
self.emo[list(user_input.values())[0][i]] = 1
user1 = User()
user_input = {
6: ["sad", "happy"],
}
user1.new_dict(user_input)
print(user1.emo)
user2 = User()
user_input = {
6: ["sad"],
}
user2.new_dict(user_input)
print(user2.emo)
我在这里得到的输出是:
{'sad': 1, 'happy': 1, 'meloncoli': 0}
{'sad': 1, 'happy': 1, 'meloncoli': 0}
然而,我应该得到:
{'sad': 1, 'happy': 1, 'meloncoli': 0}
{'sad': 1, 'happy': 0, 'meloncoli': 0}
这表明在第一个实例中更改dict值会全局更改它们。有人有这方面的经验吗?我想一个解决方案是在init方法中添加模板dict,但我不确定在这些情况下什么是最佳实践。
希望有人能启发我。
我已经解决了下面的问题-不需要使用类变量。
class User:
def __init__(self):
self.emo = {"sad": 0, "happy": 0, "meloncoli": 0}
def new_dict(self, user_input):
# if the input values (strings) are in the template, then add 1 instead of 0 as value.
for i in range(len(list(user_input.values())[0])):
if list(user_input.values())[0][i] in self.emo:
self.emo[list(user_input.values())[0][i]] = 1
运行以下程序:
user1 = User()
user_input = {
6: ["sad", "happy"],
}
user1.new_dict(user_input)
print(user1.emo)
user2 = User()
user_input = {
6: ["sad"],
}
user2.new_dict(user_input)
print(user2.emo)
这将产生:
{'sad': 1, 'happy': 1, 'meloncoli': 0}
{'sad': 1, 'happy': 0, 'meloncoli': 0}