首页 > 解决方案 > 在 PyCharm vs Jupyter Lab 中运行 exec()

问题描述

我使用python3.6, 并尝试使用lambda.yml文件加载的功能。我有一个str格式的 lambda,所以我使用该exec('l = lambda x: print(x)')函数将其转换为有效lambda并将其分配给一个变量,但是NameError: name 'l' is not defined当我尝试使用 lambda 时它会引发异常

以下玩具示例演示了我的问题:

import pandas as pd

exec('l = lambda x: x+1')
df = pd.DataFrame(dict(a=[1, 2, 3], b=[4, 5, 6]))
df.loc[:, 'c'] = df.loc[:, 'a'].apply(l)
df

NameError: name 'l' is not defined这段代码在 Jupyter Lab 中运行得很好,但是当我运行它时会导致异常PyCharm。此外,当我debug在 PyCharm 中使用该模式并尝试评估l时 - 它确实表明这是一个<function <lambda> at 0x7fe604a13f28>

我究竟做错了什么?为什么在 JupyterLab 和 PyCharm 调试模式下它可以工作,但在我运行 PyCharm 时却不行?

我将非常感谢任何帮助。

标签: pycharmpython-3.6exec

解决方案


执行exec不会自动将事物放入您的全局范围。如果要将变量exec添加到全局范围,则需要执行以下操作:

exec('l = lambda x: x + 1', globals())

然后,您可以将l其用作 exec 范围之外的函数。然而,这并不是一个好的做事方式。

我相信 JupyterLab 会自动添加exec到您的全局范围中,这可能会导致很多您不希望出现的副作用。但是,这在类似控制台的环境中是正常的。因此,如果您要在 PyCharm 控制台中运行示例中的代码,它会起作用。

在此处输入图像描述


推荐阅读