在 ipython 中访问全局变量

埃里克

ipython%run用来从文件中执行以下代码:

foo = 32

def test7():
    global foo
    print("foo before:", foo)
    foo += 1
    print("foo after:", foo)

我的ipython成绩单如下:

$ ipython
Python 3.10.2 (tags/v3.10.2:a58ebcc, Jan 17 2022, 14:12:15) ...

In [1]: %run "a1.py"

In [2]: foo
Out[2]: 32

In [3]: test7()
foo before: 32
foo after: 33

In [4]: foo
Out[4]: 32

In [5]: test7()
foo before: 33
foo after: 34

In [6]: foo
Out[6]: 32

In [7]: 

我的问题是:为什么查询foowithin的值总是在例程似乎在递增ipython时返回 32 ?test7()

有没有一种方法可以让我看到与函数看到的值相同的footest7()

标记

您可以将%run标志-i传递给“在 IPython 的命名空间中运行文件,而不是空的”。

In [1]: %run -i "a1.py"

In [2]: foo
Out[2]: 32

In [3]: test7()
foo before: 32
foo after: 33

In [4]: foo
Out[4]: 33

In [5]: test7()
foo before: 33
foo after: 34

In [6]: foo
Out[6]: 34

我发现文档有点令人困惑,但我认为他们试图解释这种行为:

该文件在最初仅由__name__=='__main__'和 sys.argv 组成的命名空间中执行,如所示。因此,它将其环境视为作为独立程序运行(除了共享全局对象,例如先前导入的模块)。但是在执行之后,IPython 交互式命名空间会更新为程序中定义的所有变量(除了__name__and sys.argv)。

另外值得注意的是python docs中的这一点:

程序员注:global 是解析器的指令。它仅适用于与全局语句同时解析的代码。特别是,提供给内置 exec() 函数的字符串或代码对象中包含的全局语句不会影响包含该函数调用的代码块,并且此类字符串中包含的代码不受包含函数调用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章