另一个Python变量范围问题

时间:2011-06-06 18:43:11

标签: python variables scope

我有以下代码:

>>> def f(v=1):
...     def ff():
...             print v
...             v = 2
...     ff()
...
>>> f()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 5, in f
  File "<stdin>", line 3, in ff
UnboundLocalError: local variable 'v' referenced before assignment

我理解为什么会出现此消息(Python variable scope question),但在这种情况下如何使用v变量? global v在这种情况下不起作用。

2 个答案:

答案 0 :(得分:6)

在Python 3.x中,您可以使用nonlocal

def f(v=1):
    def ff():
        nonlocal v
        print(v)
        v = 2
    ff()

在Python 2.x中,没有简单的解决方案。黑客攻击是使v成为一个列表:

def f(v=None):
    if v is None:
        v = [1]
    def ff():
        print v[0]
        v[0] = 2
    ff()

答案 1 :(得分:1)

你还没有将v传递给内部函数ff。它在您声明时创建自己的范围。这应该在python 2.x中运行:

def f(v=1):
  def ff(v=1):
    print v
    v = 2
  ff(v)

但是对v = 2的赋值调用在其他函数调用中不会持久。