我可以保留一份引用列表,该列表会自动更新吗?

时间:2018-09-13 08:04:57

标签: python

从本质上讲,我这样做:

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

a = False

print(ls)
> [True, False]

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

我当然可以简单地做ls[0] = False而已。但是在一个有很多活动部件的大型项目中,我想避免使用非描述性的括号索引。

我假设我可以对实例化类进行一些杂乱的构造,然后遍历属性,但这听起来像杂乱的业务。是吗?

2 个答案:

答案 0 :(得分:4)

如果要避免建立索引并且具有易于读取的属性,则可以使用具有类属性的类:

class Data:
    a = True

并保留对其的多个引用:

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

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

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

data = Data()
data2 = data

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

# original class remains unchanged
print(Data().a)
# True

在Python 3.7中,您可以使用dataclass,它使自定义数据的实例化更加简单:

from dataclasses import dataclass

@dataclass
class Data:
    a = True

data = Data(a=False)
data2 = data
print(data2.a)
# False

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

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

答案 1 :(得分:0)

我建议您使用这个非常简单的解决方案,将ls定义为函数而不是简单的列表。这样,ls()将始终返回ab的更新值。该代码非常接近您的原始代码:

a = True
b = False

ls = lambda:[a,b]

a = False
print(ls())  # [False, False]

b = True
print(ls())  # [False, True]