由于函数这一新的“成员”的加入,想一下子:那么Python中的变量是不是也要分为函数代码块内、函数代码块外两部分……?
是滴,基本上对应过来就是:局部变量和全局变量。 局部变量(只有):只能在函数代码块内部使用; 全局变量:函数内、函数外都能使用。
eg.
a.局部变量:
def name_(): #定义函数 name_()
nameA="小明" #此处的nameA就是 局部变量
print(nameA) #在函数代码块内调用变量nameA
name_() # 调用函数
print(nameA) # 在函数外调用变量nameA
>>> 小明
>>> NameError: name 'nameA' is not defined #只截取其中一部分(下同……)
b.全局变量:
def name_(): #函数部分……
print(nameA) #在函数内调用全局变量
nameA="王小明" #定义全局变量
print(nameA) #在函数外调用全局变量
name_()
>>>王小明
>>>王小明
有人就说了:傻羊,你说的俺都知道,报错呢! 别急嘛……如下图:
eg.
1 def name_(): #函数部分……
2 print(nameA) #输出…………??
3 nameA="小明" #定义局部变量
4 print(nameA) #函数内输出局部变量
5 nameA="王小明" #定义全局变量
6 print(nameA) #输出全局变量
7 name_() #调用函数
>>>王小明
>>> UnboundLocalError: local variable 'nameA' referenced before assignment
#来喽……
报错: ”局部(变量)未绑定Error:局部变量nameA调用前未绑定。”
傻羊 刚开始就觉得 代码按照5、6、7==》2、3、4的顺序进行,在第5段时定义的全局变量理论上在函数内也有效;故,函数内应该第一次输出“王小明”,第二次输出“小明” 才对呀!So,为啥酱紫呢……!
后来啊,傻羊才知道:对于函数内出现的变量,解释器会首先在该代码块内“全方位”查找变量是否已经定义【打破思维……!Python代码绝大多数情况下都是走到哪一步就解析哪一步,并把解析过的当做已知……,但是在函数这里,不一样!】,并且优先调用函数代码快内部的变量。经检验,函数内变量调用应该遵循以下逻辑:
当函数内部读取变量时:
1.程序会检索该函数代码块内的所有变量(没有顺序,真的是上面下面的全检索【哭了】……!):
1.1 若函数内代码块内没有定义这个变量,程序会往回检索函数外部已经读取的全局变量:
1.1.1若全局变量中有,正常输出;
1.1.2 else:报错 “NameError: name 'nameA' is not defined”
1.2 若函数内代码已经定义这个变量,程序会判断能不能调用;
1.2.1 能调用,正常输出;
1.2.2else:报错“UnboundLocalError: local variable 'nameA' referenced before assignment”
以上便是局部变量存在时,代码的解析顺序;而且傻羊在写这些东西的时候也就发现:“变量未定义Error”和“变量未绑定Error”其实是兄弟俩,在函数内局部变量出问题叫“未绑定”、函数外全局变量出问题叫“未定义”……
e.g
print(nameA)
nameA="王小明"
>>>NameError: name 'nameA' is not defined
2.傻羊验证思路:eg.
2.1 【对1.2.2的验证:】
def name_():
### #此处表示有若干代码……(下同)
print(nameA) #验证段代码……
nameA="小明"
print(nameA)
### #此处表示有若干代码……(下同)
name_()
>>>UnboundLocalError: local variable 'nameA' referenced before assignment
2.2 【对1.1.2的验证:】
def name_():
###
print(nameA)
###
name_()
>>>NameError: name 'nameA' is not defined
3. 此外额,傻羊还想验证一下:这个“变量未绑定Error”只存在于函数的代码块里面,同理,那么局部变量的概念也只存在于函数内;而其他缩进代码块没事……
eg.
for i in range(1,10):
print(nameA)
nameA="小明"
>>>NameError: name 'nameA' is not defined
确实,像for循环之类的,就没有这么多事……
最后,傻羊觉得,咱们所说的:“全局变量在函数内外都能调用,不能理解为:全局变量会跟着函数的检索到函数内部去;而是 函数内部的变量在函数内代码块不得解时会跳到外部找全局变量……!”