python - 如何将对象的属性设置为对象外部变量的引用

我正在尝试从头开始制作神经网络。创建输入节点时,我想传入对变量的引用,因此每次变量(输入节点从中获取数据)发生变化时我都不必重置它。这是我现在拥有的简化版本:

Class values:
    VList1 = [0, 5, 10, 15]

class source:
    def __init__(self, value) -> None:
        self.value = value

source0 = source(values.VList[1])
print (source0.value)
values.VList[1] = 25
print (source0.value)

这将打印出:

5
5

但是我希望它打印出来:

5
25

如果不手动更新 source0.value,有什么办法可以做到这一点吗?或者有没有办法在 source0 中 store 引用 values.VList[1]

回答1

当您在表达式中使用 values.VList[1] 时,它会被计算并返回对当前包含在该列表中的特定 int 的引用;它不会为您提供对列表中该位置的引用。

如果您想引用该列表位置,store 引用列表 valuessource 中的索引 1,以便您可以使用这些信息来查找当前的 value出现在列表中的该索引处。如果您希望能够方便地访问 source.value,请使用 @property

class values:
    VList = [0, 5, 10, 15]

class source:
    def __init__(self, values, index) -> None:
        self.values = values
        self.index = index
    
    @property
    def value(self):
        return self.values[self.index]


source0 = source(values.VList, 1)
print(source0.value)  # 5
values.VList[1] = 25
print(source0.value)  # 25

构建此代码的更好方法可能是使其成为可变对象列表(例如, @dataclass 这是创建主要目的是包含其他数据的类的最简单方法),以便您可以传递引用到单个对象:

from dataclasses import dataclass

@dataclass
class Source:
    value: int

values = [Source(v) for v in (0, 5, 10, 15)]

source0 = values[1]
print(source0.value)  # 5
values[1].value = 25
print(source0.value)  # 25

在上面的代码中,values 是一个 Source 对象的列表,其中每个 stores 引用了一个 value 属性。 source0 指的是一个特定的 Source,它也存储在 values 中;当您通过任一引用更改该对象的 value 时,更改通过另一个引用“可见”,因为两个 variables 都引用相同的 Source 对象,而不是不同的 int values。

如果你这样做了:

value0 = values[1].value

那么 value0 将是一个特定的 int,当原始 Source 更新时它不会更新。

相似文章