我在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中的工作方式以及整数immutable有关。为了说明这一点,当您这样做时会发生相同的情况:
value = 5
dictionary = {"key": value}
dictionary["key"] += 2
print(value)
# > 5
print(dictionary["key"])
# > 7
属性:这里要注意,这很重要,因为
self.a
是一个整数,在Python中是immutable类型。这意味着您不会通过执行self.dictionary[string] += 2
之类的操作来更改整数的值。现在,对您的问题有效的方法将是这样的,在此您声明一个列表而不是一个整数来保留mutability
class Test:
def __init__(self, a):
self.a = [a] # instead of self.a = a
self.dictionary = {'key': self.a}
def check(self, string):
print("Before: ",self.a[0])
self.dictionary[string][0] += 2
print("After (Dictionary): ",self.dictionary[string][0])
print("After (Original variable): ",self.a[0])
test = Test(5)
# > Before: 5
# > After (Dictionary): 7
# > After (Original variable): 7
根据您的代码,Test类有2个实例变量是:self.a = aself.dictionary = {'key':self.a}
self.a
指向int
对象,并且int是不可变的。即它们不能更改。创建字典对象时,您要说的是将此键指向self.a指向的同一位置。然后,由于int
是不可变的,因此当您更改字典键指向的值时,将在新的存储位置创建一个新的对象,因此现在dict键指向该新的存储位置,而不是与self.a
处于同一存储位置]仍然指向。