【问题标题】:Python scope: "UnboundLocalError: local variable 'c' referenced before assignment" [duplicate]Python范围:“UnboundLocalError:分配前引用的局部变量'c'” [重复]
【发布时间】:2010-09-13 20:47:19
【问题描述】:

我正在努力解决这个问题:

c = 1
def f(n):
    print c + n 
def g(n):
    c = c + n

f(1) # => 2
g(1) # => UnboundLocalError: local variable 'c' referenced before assignment

谢谢!

【问题讨论】:

    标签: python scope


    【解决方案1】:

    在函数中,分配给的变量默认被视为局部变量。要分配给全局变量,请使用global 语句:

    def g(n):
        global c
        c = c + n
    

    这是 Python 的古怪领域之一,我从未真正让我满意。

    【讨论】:

    • 这个和PHP类似,也需要使用global
    【解决方案2】:

    全局状态是需要避免的,尤其是需要改变它。考虑g() 是否应该只接受两个参数,或者f()g() 是否需要是具有c 实例属性的公共类的方法

    class A:
        c = 1
        def f(self, n):
            print self.c + n
        def g(self, n):
            self.c += n
    
    a = A()
    a.f(1)
    a.g(1)
    a.f(1)
    

    输出:

    2
    3
    

    【讨论】:

      【解决方案3】:

      Greg's post 的勘误表:

      在被引用之前应该没有。看一看:

      x = 1
      def explode():
          print x # raises UnboundLocalError here
          x = 2
      

      它会爆炸,即使 x 在被引用后被赋值。 在 Python 中,变量可以是局部变量,也可以是外部作用域,并且不能在一个函数中改变。

      【讨论】:

        【解决方案4】:

        除了 Greg 所说的,在 Python 3.0 中,将有一个非本地语句来声明“这里有一些名称是在封闭范围内定义的”。与全局不同,这些名称必须已经在当前范围之外定义。追踪名称和变量将很容易。现在你无法确定“全局变量”的确切定义在哪里。

        【讨论】:

          猜你喜欢
          • 2012-06-06
          • 1970-01-01
          • 2013-02-28
          • 2021-12-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多