如何解决Python:双向变量链接?
在我当前的项目中,我有一个包含许多变量的对象,我想将其中的一些变量组织成一个新的向量(更具体地说:一维numpy数组;组成变量条目为标量)。然后,我希望对该向量进行一些数学运算,并相应地自动更新原始变量。
注意:我知道我可以用更新的向量条目简单地覆盖原始变量。我想避免这种情况。还要注意,我不能简单地将向量作为所有标量变量的源,因为它是在使用了某些组成变量之后创建的。我正在通过向量中的条目与其原始变量之间的双向链接寻求一种更优雅的解决方案,因此对任何一个的任何更改都将被另一个反映。
在Python中这样的事情可能吗?
这是一个Python示例,它不做我想要的事情:
import numpy as np
# Define three variables
a = 5
b = 3
c = 2
# Create a vector which points to these variables
v = np.asarray([a,b,c])
# Print the vector
print(v)
# Update the vector
v = v*2
# Print the vector
print(v)
# Print the original variables. Should be:
# a = 10
# b = 6
# c = 4
# Actually is:
print('a = '+str(a))
print('b = '+str(b))
print('c = '+str(c))
解决方法
您正在使用的对象(int,float ..)是不可变的,因此它们不会被更新,因此无论如何都必须将其替换。
您已经提到,总而言之,解决方案将是两个选项之一。要么覆盖变量,要么尽早创建numpy数组,然后从头开始处理它。
但是,可以封装此行为:
选项1:替换变量,封装矢量并仅对变量起作用:
def vector_calculation(a,b,c):
v = np.asarray([a,c])
v = v*2
return v.tolist()
a = 5
b = 3
c = 2
a,c = vector_calculation(a,c)
选项2:尽早创建向量并完全在阵列上工作:
v = np.asarray((0,0))
v[0] = 5 # work with these like with
v[1] = 3 # individual variables
v[2] = 2
v = v*2
选项2a:创建更舒适的课程:
class Vector:
def __init__(self):
self.v = np.asarray((0,0))
@property
def a(self):
return self.v[0]
@a.setter
def a(self,val):
self.v[0] = val
@property
def b(self):
return self.v[1]
@b.setter
def b(self,val):
self.v[1] = val
@property
def c(self):
return self.v[2]
@c.setter
def c(self,val):
self.v[2] = val
vari = Vector()
vari.a = 5
vari.b = 3
vari.c = 2
vari.v = vari.v * 2
print(vari.a,vari.b,vari.c)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。