相关疑难解决方法(0)

具有嵌套函数作用域的UnboundLocalError

我有这样的代码(简化):

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 function

34
推荐指数
3
解决办法
6811
查看次数

Python内部函数

在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

9
推荐指数
1
解决办法
3874
查看次数

在使用相同名称定义局部变量之前,python无法访问非局部变量

可能重复:
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)

python scope decorator

7
推荐指数
2
解决办法
3109
查看次数

在Python中返回累加器的函数

我正在阅读黑客和画家,并对作者提到的问题感到困惑,以说明不同编程语言的力量.

问题是:

我们想编写一个生成累加器的函数 - 一个取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 closures scope common-lisp local-variables

5
推荐指数
1
解决办法
985
查看次数

你能分配给父函数中定义的变量吗?

可能重复:
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不是全球性的)

python variables scope

2
推荐指数
1
解决办法
1300
查看次数