在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
干杯