首页 > 解决方案 > python类:通过列表访问时类属性不会更新

问题描述

我在 python 类中遇到了一些奇怪的行为,我希望有人能够解释原因并修复。我正在使用 python 3.8.5。问题是当我有一个类属性列表并尝试更新它们时,它们似乎没有得到更新。这是一个简单的例子。

class testclass:
    def __init__(self) -> None:
        self.a = 2
        self.b = 3
        self.c = 4

    def update(self):
        for s in [self.a, self.b, self.c]:
            s = 10

    def response(self):
        self.update()
        print([self.a, self.b, self.c])


if __name__ == '__main__':
    myclass = testclass()
    myclass.response()

我得到的输出是 [2, 3, 4],在应用该update()方法后应该是 [10,10,10],对吧?有没有更好的方法来做这样的事情?

标签: pythonclassobject

解决方案


当您遍历 list[self.a, self.b, self.c]时,每个s实际上都是该元素的副本。

这可以更简单地归结为摆脱classself东西:

>>> f = [1, 2, 3]
>>> for s in f:
...     # s is implicitly assigned s=1, s=2, s=3
...     s = 10
... 
>>> f
[1, 2, 3]

有没有更好的方法来做这样的事情?

取决于你在这里真正想要做什么,因为这个例子似乎有点做作。一般来说,尽量避免在迭代列表时对其进行修改

假设您的目标是将每个设置self.XXX为任意 int。这是一种 Pythonic 方式,您可以这样做:

self.a = self.b = self.c = 10

确保仅对不可变数据使用此技巧,例如 int 10。例如,如果您要对列表进行链式分配,未来的分配也会改变您正在处理的属性之外的其他属性。


推荐阅读