Python 编写函数时遇到“UnboundLocalError”

        由于函数这一新的“成员”的加入,想一下子:那么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循环之类的,就没有这么多事……

              最后,傻羊觉得,咱们所说的:“全局变量在函数内外都能调用,不能理解为:全局变量会跟着函数的检索到函数内部去;而是 函数内部的变量在函数内代码块不得解时会跳到外部找全局变量……!”

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值