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

时间:2018-02-10 08:30:08

标签: 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

但是,如果我删除底部的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

我收到此错误。为什么会这样?

2 个答案:

答案 0 :(得分:1)

IPython的wrapper by Graham Campbell默认在新的命名空间中运行该文件,然后将结果复制到您的命名空间中。

foo.py包含foo()调用时,会在新命名空间中创建ABC个变量,然后IPython会复制到您的命名空间

foo.py不包含foo()来电时,您可以自己调用foo(),但foo仍在使用其原始名称空间用于全局变量。调用foo()会在A的原始命名空间中创建BCfoo个变量,对于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