当其他地方的变量发生变化时,如何更新类的列表或字典?

xar*_*tra 2 python oop

在外部更改后,如何更新包含其他 self.variables 的 self.dictionary 或 self.list ?

例如我们有以下测试类:

class Test():
   def __init__(self):
       self.some_number = 0
       self.other_number = 0
       self.lst=[self.some_number, self.other_number]
       self.dic={'some_number': self.some_number, 'other_number': self.other_number}

   def update_values(self):
       self.number = 2
       self.other_number = 3
Run Code Online (Sandbox Code Playgroud)

然后更新值:

test = Test()                  

print(test.dic)
print(test.lst)

test.update_values()

print(test.dic) 
print(test.lst)
Run Code Online (Sandbox Code Playgroud)

结果没有变化:

{'other_number': 0, 'some_number': 0}
[0, 0]
{'other_number': 0, 'some_number': 0}
[0, 0]
Run Code Online (Sandbox Code Playgroud)

我实际上认为,字典和列表保存了对指向内存中某处的这些变量的引用。因此,如果这些改变,那也应该改变。但事实似乎并非如此。有什么解释吗?

mkr*_*er1 5

self.lst如果您想在使用or时得到的值中反映更新后的值self.dic,请将它们设为property

class Test():
    def __init__(self):
        self.some_number = 0
        self.other_number = 0

    def update_values(self):
        self.some_number = 2
        self.other_number = 3

    @property
    def lst(self):
        return [self.some_number, self.other_number]

    @property
    def dic(self):
        return {'some_number': self.some_number,
                'other_number': self.other_number}
Run Code Online (Sandbox Code Playgroud)
>>> t = Test()
>>> t.lst
[0, 0]
>>> t.dic                                                          
{'some_number': 0, 'other_number': 0}
>>> t.update_values()
>>> t.lst                                                          
[2, 3]
>>> t.dic 
{'some_number': 2, 'other_number': 3}
Run Code Online (Sandbox Code Playgroud)

  • 有道理; OTOH,这确实会产生方法调用的开销,并在每次访问时动态重建列表/字典。对于小型容器来说这可能没问题,但如果它们有很多元素就不行了。 (2认同)