NameError:python中的函数定义与类/字典定义 更新
感谢@jwodder在下面的回复,我逐渐明白了这一点 下面是一个仍然让我困惑的简化示例: 在函数定义中引用后续定义的变量时,此函数运行良好:NameError:python中的函数定义与类/字典定义 更新,python,python-2.7,Python,Python 2.7,感谢@jwodder在下面的回复,我逐渐明白了这一点 下面是一个仍然让我困惑的简化示例: 在函数定义中引用后续定义的变量时,此函数运行良好: #module.py def function_scope(): var = global_var return var def print_global(): var = function_scope() print var global_var = "Here I am!" #shell: >>>
#module.py
def function_scope():
var = global_var
return var
def print_global():
var = function_scope()
print var
global_var = "Here I am!"
#shell:
>>> from module import print_global
>>> print_global()
Here I am!
但是,在类定义中引用变量的情况下,此操作失败:
这意味着导入时将“执行”类ClassScope()定义。相反,调用函数时(即导入后,因此函数可以访问模块的整个全局范围),def function\u scope()
定义被“执行”
#module.py
定义创建对象(类名称):
类别={
“ClassA”:ClassA,
}
返回类[类名称]()
类别A(对象):
通过
#script.py
从模块导入创建_对象
obj=创建对象('ClassA')
。。。但这失败了
#module.py
类别={
“ClassA”:ClassA,
}
定义创建对象(类名称):
返回类[类名称]()
类别A(对象):
通过
#script.py
从模块导入创建_对象
obj=创建对象('ClassA')
例外情况如下:
Traceback (most recent call last):
File "script.py", line 2, in <module>
from module import create_object
File ".../module.py", line 3, in <module>
'ClassA':ClassA,
NameError: name 'ClassA' is not defined
回溯(最近一次呼叫最后一次):
文件“script.py”,第2行,在
从模块导入创建_对象
文件“../module.py”,第3行,在
“ClassA”:ClassA,
NameError:未定义名称“ClassA”
看起来ClassA
不在范围内,因为它在第二个示例中的CLASSES
字典中被引用。但是,如果是这样的话,为什么在第一个示例中它从create\u object()
中可见
非常感谢您对理解这一点的任何帮助。非常感谢 这与名称查找发生的点有关,而不是范围。Python仅在执行使用标识符的代码时才尝试将标识符与对象或类关联。在第一个代码段中,
create\u object
中的名称ClassA
仅在执行create\u object()
时才被赋予一个含义,此时创建ClassA
的ClassA
定义已经执行。在第二个代码段中,您试图在定义ClassA
之前执行引用ClassA
的代码,从而创建了一个错误。哦,有趣!根据您的回复,我将全局类
字典定义移动到代码段2中module.py的底部。这就行了。但是,为什么类A
定义从snippet#1中的create_object()
函数内部引用时被视为“已经执行过”呢?我想我被你回答中的短语“当使用该标识符的代码被执行时”弄糊涂了。如果声明的顺序在代码段#2中很重要,为什么在代码段#1中不重要?或者我的意思是问:类A
定义什么时候执行?@tino:解析器一遇到类A
定义就立即执行(粗略地说)。请注意,当遇到create\u对象定义时,函数体与名称create\u对象
关联,在调用create\u对象()
之前,不会执行函数体中的实际代码。这类似于在函数中使用全局变量:函数将在调用函数时使用变量的值,而不是在定义函数时。啊,好的。因此函数的工作方式不同,函数的内容在函数被调用之前不会被解析。而类定义(和字典定义)的内容在导入时被完全解析(即“执行”)。非常感谢@jwodder,谢谢你帮助我理解!非常感谢。
Traceback (most recent call last):
File "script.py", line 2, in <module>
from module import create_object
File ".../module.py", line 3, in <module>
'ClassA':ClassA,
NameError: name 'ClassA' is not defined