【问题标题】:Can I keep a list of references, that auto update in the list?我可以保留一个参考列表,在列表中自动更新吗?
【发布时间】:2018-09-13 08:04:57
【问题描述】:

本质上,我这样做:

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

a = False

print(ls)
> [True, False]

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

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

我假设我可以对实例化类做一些混乱的构造,然后迭代属性,但这听起来很麻烦。还是这样?

【问题讨论】:

  • lstuple 并且元组是不可变的。将其更改为列表并不能解决问题,但您不能指望更新元组。
  • Python中有copy、deepcopy等概念。
  • a 是对象的名称。如果您分配给a,则不会更改您更改a 引用的对象。
  • 简而言之:没有。分配给符号(变量名)只会影响该符号。除非你改变可变对象,否则这种效果永远不会传播。
  • @barny 元组是不可变的,更适合异构数据。列表更适合同类数据。

标签: python


【解决方案1】:

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

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

【讨论】:

  • 可能值得注意的是,这只适用于 Py >= 3.7
  • 这可能是最密集的方法,再加上__iter__: yield 方法使其类似于列表。
【解决方案2】:

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

a = True
b = False

ls = lambda:[a,b]

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多