我可以保留一个参考列表,在列表中自动更新吗?

kom*_*an_ 4 python

本质上,我这样做:

a = True
b = False
ls = [a, b]

a = False

print(ls)
> [True, False]
Run Code Online (Sandbox Code Playgroud)

发生的事情是,a在第一次包含之后,发生的任何事情都会从列表中分离出来。有什么方法可以a以干净的方式更新并让列表自行更新?

当然,我可以简单地做ls[0] = False和被完成。但是在一个包含许多活动部件的大型项目中,我想避免非描述性的括号索引。

我假设我可以对实例化的类做一些凌乱的构造,然后迭代属性,但这听起来像是一团糟。或者是吗?

101*_*101 5

如果您想避免索引并具有易于阅读的属性,那么您可以使用具有类属性的类:

class Data:
    a = True
Run Code Online (Sandbox Code Playgroud)

并保留对它的多个引用:

data = Data
data2 = Data  # or similarly data2 = data

data.a = False
print(data2.a)
# False
Run Code Online (Sandbox Code Playgroud)

请注意,如果您实例化类,则需要保留对实例而不是类的引用,因为原始类将不再更新:

data = Data()
data2 = data

data.a = 123
print(data2.a)
# 123

# original class remains unchanged
print(Data().a)
# True
Run Code Online (Sandbox Code Playgroud)

从 Python 3.7 开始,您可以使用dataclass,这使得使用自定义数据进行实例化变得更简单:

from dataclasses import dataclass

@dataclass
class Data:
    a = True

data = Data(a=False)
data2 = data
print(data2.a)
# False
Run Code Online (Sandbox Code Playgroud)

最后,如果你确实关心变量状态,那么无论如何你很有可能在一个类中工作,在这种情况下你可以使用一个属性:

class SomeClass:
    def __init__(self):
        self.a = False
        self.b = True

    @property
    def ls(self):
        return self.a, self.b

some_class = SomeClass()
some_class.a = True
print(some_class.ls)
# True, True
Run Code Online (Sandbox Code Playgroud)