有没有办法使字典键指向原始变量?

问题描述 投票:0回答:1

我在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 class dictionary pointers assign
1个回答
0
投票

这与类属性的属性无关,而是与字典在Python中的工作方式有关。当您这样做时,也会发生相同的情况:

value = 5
dictionary = {"key": value}

dictionary["key"] += 2

print(value)
# > 5

print(dictionary["key"])
# > 7

0
投票

self.a指向int对象,并且int是不可变的。即它们不能更改。创建字典对象时,您要说的是将此键指向self.a指向的同一位置。然后,由于int是不可变的,因此当您更改字典键指向的值时,将在新的存储位置创建一个新的对象,因此现在dict键指向该新的存储位置,而不是与self.a处于同一存储位置]仍然指向。

所以您现在拥有self.a指向保存int 5的存储位置,而dict键指向包含int 7的另一个存储位置。


0
投票

根据您的代码,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)
© www.soinside.com 2019 - 2024. All rights reserved.