在PyCharm vs Jupyter实验室中运行exec()

在PyCharm vs Jupyter实验室中运行exec(),pycharm,python-3.6,exec,Pycharm,Python 3.6,Exec,我使用python3.6,并尝试使用从.yml文件加载的lambda函数。我有一个str格式的lambda,因此我使用exec('l=lambda x:print(x)函数将其转换为有效的lambda并将其分配给一个变量,但当我尝试使用lambda时,它会抛出name错误:name'l'未定义异常 以下玩具示例演示了我的问题: import pandas as pd exec('l = lambda x: x+1') df = pd.DataFrame(dict(a=[1, 2, 3], b=

我使用
python3.6
,并尝试使用从
.yml
文件加载的
lambda
函数。我有一个
str
格式的lambda,因此我使用
exec('l=lambda x:print(x)
函数将其转换为有效的
lambda
并将其分配给一个变量,但当我尝试使用lambda时,它会抛出
name错误:name'l'未定义
异常

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

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
这段代码在Jupyter Lab中运行得很好,但会导致一个
name错误:当我通过
PyCharm
运行它时,名称“l”未定义
异常。 另外,当我在PyCharm中使用
调试
模式并尝试评估
l
时,它确实表明这是一个

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


非常感谢您的帮助。

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

exec('l = lambda x: x + 1', globals())
然后,您可以将
l
用作exec范围之外的函数。然而,这不是一个好的做事方式

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


另一种方法是使用
eval()
而不是
exec(str,globals())
,正如
@Games Brainiac
所建议的那样:

import pandas as pd

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