非本地语句被检查而未在python中运行函数

时间:2018-07-11 14:02:22

标签: python

以前我认为,当我们定义一个函数时,该函数可能是错误的,但是python在执行之前不会对其进行检查:

$ git remote -v
origin git@windowshost:C:/some.git/
$ git push origin
fatal: ''C:/some.git/'' does not appear to be a git repository

但是,当我学习x = 100 def f(): x = 1/0 return x print(x) # >>> 100 语句时

nonlocal

即使未执行该功能,也已签出。

在哪里可以找到对此的官方解释?

对于可变边界情况的其他补充:

x = 100

def f():
    def g():
        nonlocal x
        x = x * 99
        return x
    return g

print(x)
# >>> SyntaxError: no binding for nonlocal 'x' found

如果我x = 100 def f(): global x global xx x = 99 return x print(f()) # >>> 99 print(x) # >>> 99 某个根本不存在的变量,那似乎完全没问题? 即使执行此功能,它甚至都不会带来任何错误?

此部分移至新的单个问题: Why am I able to global a non-existing varlable in python

1 个答案:

答案 0 :(得分:3)

nonlocal检查最近的包围范围不包括全局变量(即模块级变量)。也就是说,您的f()函数应声明一个x使其起作用,因为nonlocal无法看到全局x = 100变量。

请参见https://docs.python.org/3/reference/simple_stmts.html#the-global-statement

为什么在不运行函数的情况下引发错误,这是因为变量名称是在编译时绑定的。,因此不要在以下位置使用此函数也没关系所有。看到 https://docs.python.org/3/reference/executionmodel.html#resolution-of-names

但是,global具有不同的行为。就像nonlocal,如果global x已经存在,则使用它代替本地变量。但是,如果不是,则表示“如果我创建一个名为x的变量,请在全局作用域而不是函数作用域上创建”。因此,在您的示例中

x = 100
def f():
    global x
    global xx
    x = 99
    xx = 123
    return x

print(f()) # 99
print(x)   # 99
print(xx)  # 123

一个xx变量已经出现在全局名称空间中。不过,它只是编译器的提示,因此,如果您在未分配的情况下声明了global xx,并尝试稍后print(xx),则仍然会得到NameError使用未定义的变量