在类块中定义的名称范围仅限于该类块。它不会扩展到方法的代码块– 。
因此,dict()
构造函数内部的生成器具有自己的locals()
字典。现在,让我们来看看Py_eval
的源代码,特别是当这两个globals()
和locals()
是无:
if (globals == Py_None) {
globals = PyEval_GetGlobals();
if (locals == Py_None)
locals = PyEval_GetLocals();
}
因此,对于您的示例PyEval_GetLocals()
,在循环执行时globals()
将为空,它将成为全局字典。需要注意的是i
,j
与k
该函数中定义不在发电机的局部范围内,而他们是在它的封闭范围:
>>> dict((name,eval(name, globals(), {})) for name in ['i', 'j', 'k'])
{'i': 7, 'k': 10, 'j': 8}