gpt4 book ai didi

python - python中eval函数的范围

转载 作者:IT老高 更新时间:2023-10-28 20:48:09 26 4
gpt4 key购买 nike

考虑以下示例:

i=7
j=8
k=10
def test():
i=1
j=2
k=3
return dict((name,eval(name)) for name in ['i','j','k'])

返回:

>>> test()
{'i': 7, 'k': 10, 'j': 8}

为什么 eval 不考虑函数内部定义的变量?从文档中,您可以选择传递全局变量和局部变量字典。什么意思?最后,如何修改这个小案例才能让它发挥作用?

最佳答案

生成器是 implemented as function scopes :

The scope of names defined in a class block is limited to the class block; it does not extend to the code blocks of methods – this includes generator expressions since they are implemented using a function scope.

所以,dict() 构造函数中的生成器有自己的locals() 字典。现在让我们来看看Py_eval's source code , 特别是当 globals()locals() 都是 None 时:

if (globals == Py_None) {
globals = PyEval_GetGlobals();
if (locals == Py_None)
locals = PyEval_GetLocals();
}

因此,对于您的示例 PyEval_GetLocals()在循环执行时将为空,并且 globals() 将是全局字典。请注意,函数内部定义的ijk不在生成器的本地范围内,而是在其封闭范围内:

>>> dict((name,eval(name, globals(), {})) for name in ['i', 'j', 'k'])
{'i': 7, 'k': 10, 'j': 8}

关于python - python中eval函数的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27378660/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com