如果可以从局部范围读取全局变量,那么为什么我不能打印全局变量?

时间:2017-01-02 08:50:59

标签: python python-3.x global-variables

我不知道为什么我会看到UnboundLocalError

def spam():
        print(eggs)
        eggs = 'spam local'
eggs = 'global'
spam()

任何人都可以解释原因吗?

1 个答案:

答案 0 :(得分:2)

您使用eggseggs = 'spam local'重新绑定到本地范围是触发此事的原因。

Python认为由于该分配,eggs将在本地范围内,当它在调用eggs期间看起来print时,它会抱怨它正在尝试引用变量(eggs)在执行分配之前(打印后的行)。

一般情况下,我没有看到任何需要您尝试做的事情,无论哪种方式,您都可以通过使用global向Python表明您将要改变它来使其工作全局范围内的名称:

def spam():
    global eggs
    print(eggs)
    eggs = 'spam local'

或者,将值作为参数传递,这不会全局更改值,但会使其在本地可用以修复在第一次打印调用期间无法找到的引用:

def spam(eggs=eggs):
    print(eggs)
    eggs = 'spam local'

这两种方法当然有不同的语义:

  • 第一个本质上是一个提示,告诉Python你将引用/修改位于全局范围内的变量,因此知道如何加载/存储它。
  • 第二个使用eggs作为参数在本地范围内可用,eggs的全局值作为其默认值附加。现在eggsprint的查找工作正常,而eggs = 'spam local'将改变位于本地范围内的eggs

您可以根据您尝试的内容进行选择。