IPython.embed()中生成器表达式引用全局变量失败问题问询
在IPython.embed()环境中生成器表达式引用全局变量的问题
问题现象
在IPython.embed()启动的交互式环境中,使用列表推导式(或生成器表达式)引用当前会话定义的变量时,会触发NameError,提示变量未定义。但相同代码在常规Python提示符下可正常运行。
复现步骤
- 创建bug.py文件,写入代码:
import IPython;IPython.embed() - 运行该文件进入IPython交互式环境
- 依次执行以下代码:
data = list(range(17)) modulus = 3 - 执行列表推导式:
此时会触发错误:data1 = list([x for x in data if x % modulus == 0])NameError: name 'modulus' is not defined
问题原因
这是IPython的已知问题,其embed模式下的命名空间作用域处理存在异常,导致推导式无法正确识别当前会话中定义的变量。
临时解决方法
在执行推导式前,先运行以下命令,将当前局部变量同步到全局命名空间:
globals().update(locals())
之后再执行推导式即可正常访问变量。
内容的提问来源于stack exchange,提问作者Matyas
相关产品推荐
相关产品推荐

