在范围可见性方面有一种奇怪的行为,我在手册中找不到这一点。 所以,这是我的代码简化为基础。
from server import WWW_DOCUMENT_ROOT
def write_config(project_abs_path):
print WWW_DOCUMENT_ROOT
# WWW_DOCUMENT_ROOT = 'A'
在这里,如果最后一行 - 作业 - 被注释掉,print WWW_DOCUMENT_ROOT
工作正常并打印全局值。
如果取消注释分配声明 - print WWW_DOCUMENT_ROOT
停止工作并说'WWW_DOCUMENT_ROOT' referenced before assignment
。
显然问题是用global WWW_DOCUMENT_ROOT
语句修复的,但是为什么它的行为不同取决于是否要在代码中稍后分配变量。那是不稳定和不明显的,或者我在这里没有得到什么。为什么会这样?
python 2.7.3
答案 0 :(得分:0)
您在函数中引用的任何名称都被视为全局,直到您为其指定。
编译器在函数中查看赋值,并将名称标记为 local 变量。作为本地名称,WWW_DOCUMENT_ROOT
在您尝试打印时没有任何价值。
如果您希望分配给global
来影响全局变量,请使用WWW_DOCUMENT_ROOT
关键字:
def write_config(project_abs_path):
global WWW_DOCUMENT_ROOT
print WWW_DOCUMENT_ROOT
WWW_DOCUMENT_ROOT = 'A'