Lambdas、可调用类实例和作用域;为什么它在python2.7中不起作用?

2024-09-28 15:37:09 发布

您现在位置:Python中文网/ 问答频道 /正文

有人能解释一下为什么下面的代码会产生异常吗?你知道吗

>>> class CallableKlass(object):
    def __init__(self, callible):
        self.callible = callible
    def __call__(self, arg):
        return self.callible(arg)


>>> class Klass(object):
    d = {'foo': 'bar'}
    m = CallableKlass(lambda x: d[x])


>>> Klass.m('foo')

Traceback (most recent call last):
  File "<pyshell#10>", line 1, in <module>
    Klass.m('foo')
  File "<pyshell#5>", line 5, in __call__
    return self.callible(arg)
  File "<pyshell#9>", line 3, in <lambda>
    m = CallableKlass(lambda x: d[x])
NameError: global name 'd' is not defined

Tags: lambdainselfobjectfoodeflinearg
2条回答

类命名空间(直接在类主体中定义的内容)不能从该命名空间中定义的函数中访问。lambda只是一个函数,所以这也适用于lambda。你的CallableKlass是一条红鲱鱼。在这种更简单的情况下,行为是相同的:

>>> class Foo(object):
...     d = {'foo': 'bar'}
...     (lambda stuff: d[stuff])('foo')
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    class Foo(object):
  File "<pyshell#3>", line 3, in Foo
    (lambda stuff: d[stuff])('foo')
  File "<pyshell#3>", line 3, in <lambda>
    (lambda stuff: d[stuff])('foo')
NameError: global name 'd' is not defined
>>> class Foo(object):
...     d = {'foo': 'bar'}
...     def f(stuff):
...         d[stuff]
...     f('foo')
Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    class Foo(object):
  File "<pyshell#4>", line 5, in Foo
    f('foo')
  File "<pyshell#4>", line 4, in f
    d[stuff]
NameError: global name 'd' is not defined

您应该在lambda中使用Klass.d,因为在类中声明的变量将成为该类的属性。 这就是为什么您的程序会出现这个错误,因为它无法在全局变量中找到类似d的内容

class Klass(object):
    d = {'foo': 'bar'}
    m = CallableKlass(lambda x: Klass.d[x])

相关问题 更多 >