以前我认为,当我们定义一个函数时,该函数可能是错误的,但是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
答案 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
使用未定义的变量