理解的都没问题。但我想聊聊出现这种情况的原因。在讲原因之前,需要先知道python中变量的搜索顺序,这个顺序是 LGB (不考虑闭包情况)即local本地,global全局,builtin内建。比如:
a = 1
def test():
a = 3
print(a)
test()
函数内声明了局部变量 a ,在打印中使用,在本地环境中命中,因此使用的是 3。
也许你会问这个知识点我早就知道了,这和本问题有什么关系呢?
有的,难道你不觉得奇怪吗?报错是变量未初始化,而不是变量未定义。
题目中函数内 c= c+1 就已经表明了声明的变量 c 是属于局部变量的。 按理说,先执行赋值语句右侧,而此时 c 并没有声明,应该在全局环境命中才对啊。所以想象中的结果应该是局部变量 c = 2 而全局变量的 c 保持原值。
但是,这只都是想当然。讲了这么多其实我是想引出,python虽然是动态语句,但它还是会对代码做扫描工作的,会有收集有用的静态信息。函数的应该信息会放在 code 对象中,里面的信息就包含了局部变量名称的集合,可以通过 co_varnames 得到,如下:
c = 1
def test():
c= c+1
a = 3 # 另一个局部变量
print(c)
print(test.__code__.co_varnames) # ('c', 'a')
因此,