在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]:
我的问题是:为什么查询foo
within的值总是在例程似乎在递增ipython
时返回 32 ?test7()
有没有一种方法可以让我看到与函数看到的值相同的foo
值test7()
?
您可以将%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__
andsys.argv
)。
另外值得注意的是python docs中的这一点:
程序员注:global 是解析器的指令。它仅适用于与全局语句同时解析的代码。特别是,提供给内置 exec() 函数的字符串或代码对象中包含的全局语句不会影响包含该函数调用的代码块,并且此类字符串中包含的代码不受包含函数调用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句