在Python中导入变量?

1 投票
3 回答
2175 浏览
提问于 2025-04-17 15:11

我正在使用sympy这个库来通过pretty_print命令写上标。为了让这个命令正常工作,我需要先导入一些变量(比如代数中的x、y等)。如果不从sympy.abc导入这些变量,使用pretty_print命令时就得把字母放在引号里'',这样命令就无法正常工作。

举个例子,如果我想在屏幕上打印,我就需要导入x,这样它才能在程序中使用。像这样:

import sympy  
from sympy import pretty_text as exp   
from sympy.abc import x

equation= x**2

exp(equation)

这样就能在屏幕上打印出x²。问题是,如果我给x赋了一个值,它就不再等于它自己了。如果我在从sympy.abc导入后直接打印x,它会这样做:

(假装这是IDLE)>

>>> import sympy  
>>> from sympy import pretty_text as exp   
>>> from sympy.abc import x

>>> x
x 

但是如果我把x设为1

>>> import sympy  
>>> from sympy import pretty_text as exp   
>>> from sympy.abc import x

>>> x
x 
>>> x = 1
>>>x
1

那么我需要再次对x进行平方运算,

>>> import sympy  
>>> from sympy import pretty_text as exp   
>>> from sympy.abc import x

>>> x
x 
>>> x = 1
>>>x
1 
>>> equation = x**2
>>> exp(equation)
1

结果只会平方1。即使我尝试把x = 'x'再赋值一次,它也不一样,因为它周围有''。我只能通过再次导入来解决这个问题。不过,在我的程序中,我可能需要再次导入任何字母,所以我需要导入一个变量。我试过

from sympy.abc import x[0]

但那是无效的。那么,有没有办法让我导入一个变化的字母呢?

3 个回答

0

如果你这样做:

import sympy.abc
x = sympy.abc.x

那么每当你需要原来的值时,只需使用 sympy.abc.x。如果你需要动态获取一个名字:

getattr(sympy.abc, "x")

这里的字面量可以被任何变量替代。

1

在SymPy中,你不需要导入符号名称。abc模块只是为了方便使用一个字母的符号名称。

你只需要用你想要的任何名称来创建Symbol对象(这个名称可以是任何字符串,包括动态生成的名称)。

>>> x = Symbol('x')
>>> x
x

另外,你给符号起的名字和存放这个符号的Python变量名并不需要有关系。实际上,一个Symbol并不知道它绑定了哪些Python变量名(这也是Python的工作方式,不仅仅是SymPy)。

>>> x = Symbol('y')
>>> x
y 

你还可以使用symbols一次性创建多个符号。

>>> x, y, z = symbols('x y z')
2

如果你想保留符号,就不要给它们赋值——继续使用符号,直到你真的需要解决方案的时候。

举个例子:

In [15]: equation=sympy.sin(x**2)

In [16]: exp(equation)
   ⎛ 2⎞
sin⎝x ⎠

In [17]: result = equation.subs({'x': 2})

In [18]: result
Out[18]: sin(4)

In [19]: result.evalf()
Out[19]: -0.756802495307928

这并没有改变x本身——之后:

In [23]: exp(sympy.log(x**.5))
   ⎛ 0.5⎞
log⎝x   ⎠

尽量保持你的方程式是符号形式,直到你需要的时候再去关心具体的数值。

撰写回答