Python函数声明一个动态全局变量

时间:2018-01-15 02:02:16

标签: python global sympy

我看到下面的代码,我无言以对。这是:

>>> import sympy
>>> sympy.var('x')
x
>>> x
x
>>> type(x)
<class 'sympy.core.symbol.Symbol'>
>>>

请注意,从未分配变量x。发生了什么事?

在我看来,函数sympy.var接受一个字符串作为输入参数,并声明一个类型为sympy.core.symbol.Symbol的全局变量,其名称等同于参数。因此,每次调用该函数时,都会有一个新变量,其名称是传递给函数的最后一个参数。

2 个答案:

答案 0 :(得分:2)

来自(DOCS

sympy.core.symbol.var(names, **args)
  

创建符号并将其注入全局命名空间。

答案 1 :(得分:2)

要向@Stephen Rauch的答案添加一些细节,请查看核心源代码:

from inspect import currentframe
frame = currentframe().f_back

try:
    syms = symbols(names, **args)

    if syms is not None:
        if isinstance(syms, Basic):
            frame.f_globals[syms.name] = syms
        elif isinstance(syms, FunctionClass):
            frame.f_globals[syms.__name__] = syms
        else:
            traverse(syms, frame)
finally:
    del frame  # break cyclic dependencies as stated in inspect docs

如您所见,使用inspect.currentframe().f_back.f_globals,您可以获得最新的globals