Sympy 获取符号名称

Sympy get Symbol name

我可以得到一个 "undefined" 交易品种的名称:

import sympy as sym
knodef = sym.Symbol('k_{nodef}')
print(type(knodef))
sym.pprint(knodef.name)

<class 'sympy.core.symbol.Symbol'>
k_{nodef}

但是当我把它定义为一个表达式时,我就再也找不到名字了。

kdef = sym.Symbol('k_{def}')
kdef = sym.tan(b*x)
print(type(kdef))
sym.pprint(kdef.name)                        # AttributeError: 'tan' object has no attribute 'name'

tan
<Error raised>

如何获取 kdef 的名称?

类似的功能...

knodef2 = sym.Function('k_{nodef2}')
#display(disp.Math(knodef2.name), type(knodef2))
print(type(knodef2))
sym.pprint(knodef2.name)

<class 'sympy.core.function.UndefinedFunction'>
k_{nodef2}

...(在这种情况下是否等效于定义 Symbol)?

正如您所演示的,Symbol 和 Function 的 name 属性可用于 return "name" 的字符串形式。对于 UndefinedFunction,您可以使用 .func.name 来获取该字符串,但是对于已定义的 FunctionClass,您可以在 func 属性上使用 str

>>> s=Symbol('s');f=Function('f');a=f(s);b=tan(s)
>>> s.name
's'
>>> f.name
'f'
>>> a.func.name
'f'
>>> str(b.func)
'tan'

根据 hpaulj 的评论和不可告人的实验和学习的答案...

分配 kdef = sym.Symbol('k_{def}') 分配名称 'k_{def}',因为这是 class sym.Symbol.

的属性

后面赋值kdef = sym.tan(b*x)只是定义了一个classsym.tan的新对象,并把kdef作为它的变量,其实和前一个对象。所以在这一点上,kdef'k_{def}'.

之间就没有更多的关联了

这很容易看出:

kdef = sym.Symbol('k_{def}')
print('kdef = ', kdef, ', address = ', hex(id(kdef)), sep='')
kdef = sym.tan(b*x)
print('kdef = ', kdef, ', address = ', hex(id(kdef)), sep='')

kdef = k_{def}, address = 0x20f21b58228
kdef = tan(b*x), address = 0x20f21b584f8

这甚至发生在分配给相同类型时,原则上可以使用完全相同的内存块:

q = 2.1
print('q = ', q, ', address = ', hex(id(q)), sep='')
q = 30000.1
print('q = ', q, ', address = ', hex(id(q)), sep='')

q = 2.1, address = 0x1c4dbd5d0d0
q = 30000.1, address = 0x1c4dbd5d2b0

此外,还发现classsym.tan没有name,所以获取不到,因为不存在。 由于给定的变量可能有也可能没有 name,因此可以简单地 try/expect,或使用 dir().

查询