如何在python方法中使用globals()更改全局变量?
如果我有以下Python脚本foo.py:如何在python方法中使用globals()更改全局变量?,python,dictionary,global-variables,ipython,Python,Dictionary,Global Variables,Ipython,如果我有以下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 run foo.py foo() => 1 => 2 => 3 A =>
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
run foo.py
foo()
=> 1
=> 2
=> 3
A
=> NameError: name 'A' is not defined
但是,如果我删除底部的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
=> 1
=> 2
=> 3
A
=> 1
run foo.py
foo()
=> 1
=> 2
=> 3
A
=> NameError: name 'A' is not defined
我得到这个错误。为什么会出现这种情况?在赋值之前,您需要声明
元素dict
一个全局变量。在函数中的任意位置有assign语句后,除非另有规定,否则将仅在局部作用域上声明要分配的变量。在您的情况下,element\u dict
是由于element\u dict=read\u mass\u from\u file()
而在本地声明的
要实际引用全局变量,请执行以下操作:
def mass_mode() :
'''
Add element names and masses to the global variables.
'''
global element_dict
element_dict = read_mass_from_file()
将从全局范围更新元素dict
。IPython的默认设置是在新命名空间中运行文件,然后将结果复制到命名空间中
当foo.py
包含foo()
调用时,将在新命名空间中创建a
、B
和C
变量,然后IPython将这些变量复制到您的命名空间中
当foo.py
不包含foo()
调用时,您可以自己调用foo()
,但foo
仍使用其原始全局名称空间。调用foo()
会在foo
的原始名称空间中创建A
、B
和C
变量,对于IPython来说,获取这些变量并将其复制到您的名称空间已经太晚了
您可以使用
%run
和-i
标志直接在您的命名空间中运行文件,以避免这些问题。您可以举一个元素dict
@PratikKumar{'H':1.0,'He':4.0,'C':12.0}@PratikKumar的例子吗?我将把问题改得更容易回答understand@PratikKumar更新print('A')
会直接打印A,而不是1。在提问时,请发布您实际运行的代码以及通过运行它获得的实际输出。感谢您的回答!我刚刚编辑了这个问题。你如何看待这个新问题?答案还是一样的吗?