我有这样的代码(简化):
def outer():
ctr = 0
def inner():
ctr += 1
inner()
Run Code Online (Sandbox Code Playgroud)
但是ctr会导致错误:
Traceback (most recent call last):
File "foo.py", line 9, in <module>
outer()
File "foo.py", line 7, in outer
inner()
File "foo.py", line 5, in inner
ctr += 1
UnboundLocalError: local variable 'ctr' referenced before assignment
Run Code Online (Sandbox Code Playgroud)
我怎样才能解决这个问题?我认为嵌套的范围可以让我这样做.我试过'全球',但它仍然无效.
在python中,我可以写:
def func():
x = 1
print x
x+=1
def _func():
print x
return _func
test = func()
test()
Run Code Online (Sandbox Code Playgroud)
当我运行它时,输出是:
1
2
由于_func可以访问func中定义的"x"变量.对...
但如果我这样做:
def func():
x = 1
print x
def _func():
x+=1
print x
return _func
test = func()
test()
Run Code Online (Sandbox Code Playgroud)
然后我收到一条错误消息:UnboundLocalError:在赋值之前引用的局部变量'x'
在这种情况下,似乎_func不能"看到""x"变量
问题是:为什么在第一个例子中打印x"看到""x"变量,而数学运算符x + = 1抛出异常?
我不明白为什么......
可能重复:
Python嵌套函数变量作用域
我之前使用过装饰器,所以我很惊讶地发现我的代码中有一个错误:
def make_handler(name, panels):
def get(self):
admin = True
keys = [ndb.Key('Panel', panel) for panel in panels]
panels = zip(ndb.get_multi(keys), panels)
panels = [(panel.panel_html if panel else get_default_content(panel_id), panel_id) for panel, panel_id in panels]
templates = {'panels': panels, 'admin': admin}
self.render_template('panel_page.html', **templates)
return type(name, (BaseHandler,), {'get': get})
"""
Traceback (most recent call last):
File "C:\Program Files\Google\google_appengine\lib\webapp2\webapp2.py", line 1536, in __call__
rv = self.handle_exception(request, response, e)
File "C:\Program Files\Google\google_appengine\lib\webapp2\webapp2.py", line 1530, in __call__
rv = self.router.dispatch(request, response)
File "C:\Program …Run Code Online (Sandbox Code Playgroud) 我正在阅读黑客和画家,并对作者提到的问题感到困惑,以说明不同编程语言的力量.
问题是:
我们想编写一个生成累加器的函数 - 一个取n的函数,并返回一个函数,该函数接受另一个数字i并返回n递增i.(这是增加的,而不是加号.累加器必须累积.)
作者提到了几种使用不同编程语言的解决方案.例如,Common Lisp:
(defun foo (n)
(lambda (i) (incf n i)))
Run Code Online (Sandbox Code Playgroud)
和JavaScript:
function foo(n) { return function (i) { return n += i } }
Run Code Online (Sandbox Code Playgroud)
但是,当涉及到Python时,以下代码不起作用:
def foo(n):
s = n
def bar(i):
s += i
return s
return bar
f = foo(0)
f(1) # UnboundLocalError: local variable 's' referenced before assignment
Run Code Online (Sandbox Code Playgroud)
一个简单的修改将使其工作:
def foo(n):
s = [n]
def bar(i):
s[0] += i
return …Run Code Online (Sandbox Code Playgroud) 可能重复:
Python嵌套函数变量作用域
经过多次试验和错误后,我终于发现这不起作用:
def a():
def b():
print x
x=2
x = 1
b()
print x
Run Code Online (Sandbox Code Playgroud)
你得到一个例外(x在被引用之前没有定义).因此看起来b可以从x读取,但如果它试图分配给它,Python将其对'x'的解释更改为局部变量,现在没有定义.
对我自己生病的好奇心的疑问:有没有办法实现这个目标?有没有办法显式访问父函数的范围?(x不是全球性的)