【问题标题】:Why can only some functions use variables declared outside of the function?为什么只有某些函数可以使用在函数外部声明的变量?
【发布时间】:2013-10-08 15:17:03
【问题描述】:

我有这个代码:

def r():
    i += 1
    return i

def f():
    return x*a

i = 0

a=2 
x=3

print f()
print r()

r() 出现此错误,f() 却没有:

~$ python ~/dev/python/inf1100/test.py 
6
Traceback (most recent call last):
  File "/home/marius/dev/python/inf1100/test.py", line 18, in <module>
    print r()
  File "/home/marius/dev/python/inf1100/test.py", line 2, in r
    i += 1
UnboundLocalError: local variable 'i' referenced before assignment

为什么f() 可以使用函数外部定义的变量,而r() 不能?

【问题讨论】:

  • 当您在函数中进行赋值时,您会在本地命名空间中创建一个 new 对象,否则您将使用全局命名空间中的变量。
  • 请注意,99% 的情况下,如果您想写入全局变量,您就做错了 :)

标签: python function global-variables


【解决方案1】:

这是因为r 重新分配全局变量i。另一方面,f 只是使用它。请记住,i += 1i = i + 1 相同。

除非你明确告诉它,否则 Python 将函数中使用的所有变量都视为本地变量。此外,由于在r 的本地范围内没有定义变量i,因此会引发错误。

如果你想在一个函数中重新分配一个全局变量,你必须把:

global var

在函数的顶部显式声明var 是全局的。

所以,要使r 工作,它应该重写为:

def r():
    global i
    i += 1
    return i

【讨论】:

    【解决方案2】:

    我想指出,大多数时候,这个:

    x = 1
    
    def f():
        global x
        x += 1
    
    f()
    

    是不好的做法,你想使用参数来代替:

    x = 1
    
    def f(a_number):
        return a_number + 1
    
    x = f(x)
    

    另外,这里:

    def r():
        global i
        i += 1
        return i
    

    return i是多余的,通过函数的调用增加变量。

    另外,this 部分 Python 常见问题解答是相关且有用的。

    【讨论】:

      【解决方案3】:

      这件作品:

      def r():
          i += 1
          return i
      

      不仅使用全局变量,还尝试修改它们(或者更准确地说:为全局变量i分配不同的值)。

      要使其工作,您只需将此变量声明为全局变量:

      def r():
          global i
          i += 1
          return i
      

      【讨论】:

        【解决方案4】:

        r 中,您正在影响您的全局i。由于在您尝试添加之前未分配它,因此您会收到错误。

        一种可能的解决方案是像这样在r 函数中使用global i

        def r():
            global i
            i += 1
            return i
        

        【讨论】:

          【解决方案5】:

          如果你给一个变量赋值,python 会认为这个变量是本地的,不会费心寻找一个同名的全局变量。按照其他答案中的建议使用global

          【讨论】:

            猜你喜欢
            • 2019-02-08
            • 2015-02-10
            • 2020-08-31
            • 2021-04-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-06-27
            相关资源
            最近更新 更多