我在Python中遇到类属性和字典的问题。我有以下课程:
class Test:
def __init__(self, a):
self.a = a
self.dictionary = {'key': self.a}
def check(self, string):
print("Before: ",self.a)
self.dictionary[string] += 2
print("After (Dictionary): ",self.dictionary[string])
print("After (Original variable): ",self.a)
然后我从中创建对象测试:
test = Test(5)
问题是:当我使用检查方法时:
test.check('key')
输出为:
Before: 5
After (Dictionary): 7
After (Original variable): 5
我期望通过更改分配了self.a
属性的字典self.dictionary
值,可以在类内部更改属性self.a
。但是发生的事情是原始属性self.a
并没有改变,而字典中原本应该为self.a
的值却发生了变化。
有人可以向我解释为什么会这样吗?我假设字典正在创建self.a
的副本作为'key'
的值。有什么办法可以让字典的值指向原始变量self.a
,以便我可以通过更改字典的值来更改它?
这与类属性的属性无关,而是与字典在Python中的工作方式有关。当您这样做时,也会发生相同的情况:
value = 5
dictionary = {"key": value}
dictionary["key"] += 2
print(value)
# > 5
print(dictionary["key"])
# > 7
self.a
指向int
对象,并且int是不可变的。即它们不能更改。创建字典对象时,您要说的是将此键指向self.a指向的同一位置。然后,由于int
是不可变的,因此当您更改字典键指向的值时,将在新的存储位置创建一个新的对象,因此现在dict键指向该新的存储位置,而不是与self.a
处于同一存储位置]仍然指向。
所以您现在拥有self.a指向保存int 5的存储位置,而dict键指向包含int 7的另一个存储位置。
根据您的代码,Test类有2个实例变量是:self.a = aself.dictionary = {'key':self.a}
在检查方法中,您正在更改/更新self.dictionary变量,而不是在self.a上(self.dictionary [string] + = 2)如果要更新self.a,则self.dictionary和self.a是两个不同的变量,可以执行以下操作:
class Test:
def __init__(self, a):
self.a = a
self.dictionary = {'key': self.a}
def check(self, string):
print("Before: ",self.a)
self.a+=2
self.dictionary[string] = self.a
print("After (Dictionary): ",self.dictionary[string])
print("After (Original variable): ",self.a)
输出将是:
('Before: ', 5)
('After (Dictionary): ', 7)
('After (Original variable): ', 7)