考虑以下代码:
def f():
y = x + 1
x = 1
f()
此代码运行良好。据我了解,调用该函数时,python首先在本地范围内搜索名称x
,由于找不到它,因此它搜索全局范围,并读取{{1}的值},然后从那里继续执行代码。到目前为止,一切都很好。
但是下面的代码会抛出x
:
UnboundLocalError: local variable 'x' referenced before assignment
所以我的猜测是python决定def g():
y = x + 1
x = y
x = 1
g()
定义内的x
是局部变量。但是什么时候做出这个决定?
我猜这不会在代码执行期间发生(在最后一行中调用g
时)。因为那样,python会读取g
定义内的第一行,并像在g
中一样解释它,以作为对全局变量f
的引用。然后它将读取x
定义中的第二行,并创建一个局部变量g
。那意味着在g的定义内,相同的名称x
意味着全局和局部在不同的行,这将是一场噩梦!
我想知道是否在解析x
语句时做出将x
绑定到本地名称空间的决定。不过,令我困惑的是,仅在调用函数时(因此在执行过程中)才会引发错误,而在解析函数定义时,不会在def
语句之后引发错误。