代码中的问题是 Vector.numerical_vector 是浮点数副本的列表,但是我需要将其作为引用列表,因此,当Vector.vector [n] .value更改时,Vector.numerical_vector [n]也更改为相同的值。
谢谢您的帮助!
class Var:
def __init__(self, val):
self.value = float(val)
def __float__(self):
return self.value
class Vector:
def __init__(self, vector):
self.vector = vector
self.numerical_vector = [float(x) for x in vector]
vars = [Var(i) for i in range(5)]
vector = Vector(vars)
答案 0 :(得分:0)
您可能要为此使用property
。
class Vector:
def __init__(self, vector):
self.vector = vector
@property
def numerical_vector(self):
return [x.value for x in self.vector]
现在vector.numerical_vector
将始终同步。这种方法的一个缺点是,每次访问它时都会重新计算它,有些可能不适合您的特定应用程序。
如果性能存在问题,则可以向Vector添加__getitem__
和__setitem__
方法,如下所示:
class Vector:
def __init__(self, vector):
self.vector = vector
self.numerical_vector = [float(x) for x in vector]
def __getitem__(self, i):
return self.vector[i]
def __setitem__(self, i, val):
self.vector[i] = val
self.numerical_vector[i] = float(val)
在这种情况下,如果您设置vector_instance[i]
,那么vector_instance.numerical_vector[i]
也将被修改。但是,如果您想直接修改vector_instance.vector[i]
,则同步性将被破坏。
根据用例,可以使用两种方法之一。两者都有局限性,但我认为没有更多的事情可以做。
答案 1 :(得分:0)
没有办法在python中做到这一点。您可以做的是使numerical_vector
一个对象,该对象在被访问时返回对应的float
项目的vector
值。例如
class VectorWrapper:
def __init__(self, vector):
self.vector = vector
def __getitem__(self, i):
return float(self.vector[i])
并设置self.numerical_vector = VectorWrapper(self.vector)
如果必须在引用float
时返回self.numerical_vector[i]
表示形式,