如果我有以下Python脚本foo.py:
def foo() :
my_dict = {'A': 1, 'B': 2, 'C': 3}
globals().update(my_dict)
print(A)
print(B)
print(C)
foo()
我可以在ipython中输入:
run foo.py
=> 1
=> 2
=> 3
A
=> 1
但是,如果我删除底部的foo():
def foo() :
my_dict = {'A': 1, 'B': 2, 'C': 3}
globals().update(my_dict)
print(A)
print(B)
print(C)
# no foo
我在ipython中输入:
run foo.py
foo()
=> 1
=> 2
=> 3
A
=> NameError: name 'A' is not defined
我收到此错误。为什么会这样?
答案 0 :(得分:1)
IPython的wrapper by Graham Campbell默认在新的命名空间中运行该文件,然后将结果复制到您的命名空间中。
当foo.py
包含foo()
调用时,会在新命名空间中创建A
,B
和C
个变量,然后IPython会复制到您的命名空间
当foo.py
不包含foo()
来电时,您可以自己调用foo()
,但foo
仍在使用其原始名称空间用于全局变量。调用foo()
会在A
的原始命名空间中创建B
,C
和foo
个变量,对于IPython来说,它们来不及接收和复制将它们放入你的命名空间。
您可以将%run
与-i
标志一起使用,直接在命名空间中运行该文件,从而避免这些问题。
答案 1 :(得分:0)
在分配之前,您需要声明element_dict
一个全局变量。除非另有说明,否则在函数中具有任何位置的赋值语句后,所分配的变量仅在本地范围内声明。在您的情况下,element_dict
由于element_dict = read_mass_from_file()
而在本地宣布。
See the documentation for more details.
实际引用全局变量:
def mass_mode() :
'''
Add element names and masses to the global variables.
'''
global element_dict
element_dict = read_mass_from_file()
将从全局范围更新element_dict
。