如何在python方法中使用globals()更改全局变量?

如何在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 =>

如果我有以下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
=> 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。在提问时,请发布您实际运行的代码以及通过运行它获得的实际输出。感谢您的回答!我刚刚编辑了这个问题。你如何看待这个新问题?答案还是一样的吗?