关于python:嵌套函数中的奇怪范围

Strange Scoping in Nested Functions

本问题已经有最佳答案,请猛点这里访问。

我有两个嵌套的python函数,如下所示:

1
2
3
4
5
6
def outer():
  t = 0
  def inner():
    t += 1
    print(t)
  inner()

尝试调用outer会导致以下错误:

1
2
3
4
5
6
7
8
>>> outer()
Traceback (most recent call last):
  File"<stdin>", line 1, in <module>
  File"sally.py", line 6, in outer
    inner()
  File"sally.py", line 4, in inner
    t += 1
UnboundLocalError: local variable 't' referenced before assignment

我想在t += 1之前加上global t行会有所帮助,除非没有。

为什么会这样?除了每次打电话给inner以外,我如何解决这个问题?


如果使用python 3,那么使用非本地关键字会让解释器知道使用outer()函数的t范围:

1
2
3
4
5
6
7
def outer():
  t = 0
  def inner():
    nonlocal t
    t += 1
    print(t)
  inner()

< BR>如果使用python 2,那么就不能直接给变量赋值,否则会使解释器创建一个新的变量t,它将隐藏外部变量。可以传入可变集合并更新第一个项:

1
2
3
4
5
6
def outer():
  t = [0]
  def inner():
    t[0] += 1
    print(t[0])
  inner()