Python dict作为类变量的问题



我在使用字典时遇到了一些问题,字典是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}

最新更新