我想知道为什么我的代码不能工作。我原以为它会返回11,结果却创建了一个异常:
def f():
counter = 1
def f1():
global counter
counter += 1
while True:
f1()
if counter>10:
return(counter)
f()
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-219-0ec059b9bfe1> in <module>()
----> 1 f()
<ipython-input-218-50c23b042204> in f()
9 counter += 1
10
---> 11 f1()
12
13 if counter>10:
<ipython-input-218-50c23b042204> in f1()
7 global counter
8
----> 9 counter += 1
10
11 f1()
NameError: name 'counter' is not defined
既然counter被声明为全局变量,并且它出现并定义在f1((的周围环境中——在f((内部——为什么我会收到这个错误消息?
错误是因为您试图在全局counter
尚未给定值的情况下增加其值。f()
函数中的计数器与f1()
函数中的全局counter
位于不同的范围和变量中。
您必须为将在中使用此全局变量的每个作用域指定global counter
。因此,这样做应该可以解决您的问题:
def f():
global counter
counter = 1
def f1():
global counter
counter += 1
f1()
if counter > 10:
return(counter)
f()
我还建议避免在没有充分理由的情况下在函数中声明函数,也不要使用全局变量,因为这会使程序复杂化。最好将counter
作为参数传递给函数并返回结果。
不使用全局或嵌套函数的示例:
def f():
counter = 1
result = f1(counter)
if result > 10:
return(result)
def f1(argument):
argument += 1
return argument
f()
它不是全局变量。在全球范围内,它并不存在。使用nonlocal
而不是global
。