python何时确定名称是本地名称还是对全局变量的引用?

时间:2018-07-12 02:39:06

标签: python python-3.x namespaces

考虑以下代码:

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语句之后引发错误。

0 个答案:

没有答案