我有一个SymPy符号变量:
from sympy import symbols x=symbols('x')
如何在符号变量 x 中添加新字段?
x
x.New_Field=Arbitrary_Value
您无法动态地将属性添加到 Symbol .
Symbol
这很可能是一个坏主意,因为SymPy假设它可以替换相等的表达式 . 因此,如果您创建了两个符号并将一个属性动态存储在一个中(假设这是可能的)
a1 = Symbol('a') a2 = Symbol('a') a1.something = 0
然后SymPy可以自由地交换 a1 和 a2 ,只要它们感觉这样做,因为它们比较平等( a1 == a2 ),这肯定会产生意想不到的后果 .
a1
a2
a1 == a2
如果您查看source code,您可以看到 Symbol 在其类中定义了 __slots__ ,这是出于性能原因,它有效地告诉解释器“这些是此类中的所有实例属性” . 这就是您无法动态向 Symbol 添加属性的原因 .
__slots__
一种可能的替代方法是创建一个 Symbol 的子类,它将所需的属性存储在 args 中,这样它们就会被分解为子类对象的相等比较 .
args
有关我在这里有所解释的主题的扩展讨论,请参阅Google主题:How to equip a Symbol with an additional attribute?
1 回答
您无法动态地将属性添加到
Symbol
.这很可能是一个坏主意,因为SymPy假设它可以替换相等的表达式 . 因此,如果您创建了两个符号并将一个属性动态存储在一个中(假设这是可能的)
然后SymPy可以自由地交换
a1
和a2
,只要它们感觉这样做,因为它们比较平等(a1 == a2
),这肯定会产生意想不到的后果 .如果您查看source code,您可以看到
Symbol
在其类中定义了__slots__
,这是出于性能原因,它有效地告诉解释器“这些是此类中的所有实例属性” . 这就是您无法动态向Symbol
添加属性的原因 .一种可能的替代方法是创建一个
Symbol
的子类,它将所需的属性存储在args
中,这样它们就会被分解为子类对象的相等比较 .有关我在这里有所解释的主题的扩展讨论,请参阅Google主题:How to equip a Symbol with an additional attribute?