1

范围可见性有一个奇怪的行为,我在手册中找不到这个。所以,这是我简化为基础的代码。

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

4

1 回答 1

0

您在函数中引用的任何名称都被视为全局名称,直到您分配给它为止

编译器看到函数中的赋值并将名称标记为局部变量。作为本地名称,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'
于 2013-08-01T13:43:15.473 回答