lambda中的外部变量在Python中起作用

Ame*_*ina 9 python django lambda ipython

受到这个答案中的构造的启发,我试图做以下事情:

values = range(3)
vector = np.random.randint(3, size=(5,))
f = lambda x: x in values
result = [f(a) for a in values]
Run Code Online (Sandbox Code Playgroud)

但我明白了global name 'values' is not defined.

如果我尝试上面链接的解决方案,我得到同样的错误,即:

A = [[0,1,2], [1,2,3], [2,3,4]]
v = [1,2]
B = [map(lambda val: val in v) for a in A]
Run Code Online (Sandbox Code Playgroud)

自该解决方案发布以来,Python有没有改变?(我正在使用2.7.4).如果是这样,我如何在lambda函数中访问外部变量?我应该宣布它是全球性的吗?传递它作为另一个输入?

更新1:

我只是在IPython(1.0)的嵌入式shell中注意到这个问题.

更新2:

GitHub上有关于该主题的IPython 票证,但目前还不清楚问题是否已经解决.

更新3(不是来自OP):

这个错误可以在django的shell中重新生成(感谢@Ashwini)

$ ./manage.py shell
Python 2.7.4 (default, Apr 19 2013, 18:32:33) 
Type "copyright", "credits" or "license" for more information.

IPython 0.13.2 -- An enhanced Interactive Python.

In [1]: import numpy as np
In [2]: values = range(3)
In [3]: vector = np.random.randint(3, size=(5,))
In [4]: f = lambda x: x in values
In [5]: result = [f(a) for a in values]
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
/usr/local/lib/python2.7/dist-packages/django/core/management/commands/shell.pyc in <module>()
----> 1 result = [f(a) for a in values]
/usr/local/lib/python2.7/dist-packages/django/core/management/commands/shell.pyc in <lambda>(x)
----> 1 f = lambda x: x in values

NameError: global name 'values' is not defined
In [6]: values
Out[6]: [0, 1, 2]
Run Code Online (Sandbox Code Playgroud)

Ant*_*ala 1

我知道您的示例和错误报告中的代码确实可以在金字塔框架的交互式 shell(pshell,使用 ipython 0.12!)中成功运行,尽管我记得以前遇到过这个问题。关键是 ipython >= 0.11 它使用不同的代码。据我所知,0.10版本的代码仍然会有这个bug。

这是金字塔 pshell.py 的简化摘录

def make_ipython_v0_11_shell():
    try:
        from IPython.frontend.terminal.embed import (
            InteractiveShellEmbed)
        IPShellFactory = InteractiveShellEmbed
    except ImportError:
        return None

    def shell(env, help):
        IPShell = IPShellFactory(banner2=help + '\n', user_ns=env)
        IPShell()

   return shell

def make_ipython_v0_10_shell():
    try:
        from IPython.Shell import IPShellEmbed
        IPShellFactory = IPShellEmbed
    except ImportError:
        return None

    def shell(env, help):
        IPShell = IPShellFactory(argv=[], user_ns=env)
        IPShell.set_banner(IPShell.IP.BANNER + '\n' + help + '\n')
        IPShell()

    return shell
Run Code Online (Sandbox Code Playgroud)