• python:UnboundLocalError: local variable 'xxx' referenced before assignment


    近来一直都在学习python语言,偶然在伯乐在线看到2017年京东C/C++的面试题。就打算用python+ST3 IDE顺便敲下面试题代码。

    原题 C语言:

     1 #include <stdio.h>
     2 int cnt=0;
     3 int fib(int n){
     4   cnt++;
     5   if(n==0) 
     6     return 1; 
     7   else if(n==1) 
     8     return 2; 
     9   else 
    10     return fib(n-1)+fib(n-2);
    11 }
    12 void main()
    13 {
    14   fib(8);
    15   printf("%d",cnt);//问题:cnt等于多少?
    16 }

    原题 python语言:

     1 cnt = 0
     2 def fib(n):
     3     cnt+=1
     4     if n==0:
     5         return 1
     6     if n==1:
     7         return 2
     8     return fib(n-1)+fib(n-2)
     9 values = fib(8)
    10 print cnt ,values

    乍一眼看,我写的python代码没错吧。但是很囧的事情,既然我写的python代码报错了(python初学者,大家误喷)。

    提示局部变量'cnt'在没有声明就引用了。后来想到python提供global关键字引用全局变量。就尝试了一番。

     1 cnt = 0
     2 def fib(n):
     3     global cnt
     4     cnt+=1
     5     if n==0:
     6         return 1
     7     if n==1:
     8         return 2
     9     return fib(n-1)+fib(n-2)
    10 values = fib(8)
    11 print cnt ,values

    没报错,正常运行。后来多方收集资料,针对全局变量和局部变量的使用,总结如下:

    1.内部函数,不修改全局变量可以直接访问全局变量。

     1 cnt = 0
     2 def fib(n):
     3     #global cnt
     4     #cnt+=1
     5     print cnt #直接访问全局变量,不修改,不报错
     6     if n==0:
     7         return 1
     8     if n==1:
     9         return 2
    10     return fib(n-1)+fib(n-2)
    11 values = fib(8)
    12 print cnt ,values

    2.内部函数,修改同名全局变量,则python会认为它是一个局部变量。如要让python认为是全局变量,使用global关键字。

     1 cnt = 0
     2 def fib(n):
     3     #global cnt
     4     cnt = n
     5     print 'fib inside:cnt = %d' % cnt
     6     if n==0:
     7         return 1
     8     if n==1:
     9         return 2
    10     return fib(n-1)+fib(n-2)
    11 fib(1)
    12 print cnt
    13 
    14 fib inside:cnt = 1
    15 0

    3.在内部函数修改同名全局变量之前调用变量名称(如print sum),则引发Unbound-LocalError。

     1 cnt = 0
     2 def fib(n):
     3     #global cnt
     4     print cnt #这行报错
     5     cnt+=1
     6     if n==0:
     7         return 1
     8     if n==1:
     9         return 2
    10     return fib(n-1)+fib(n-2)
    11 values = fib(8)
    12 print cnt ,values
  • 相关阅读:
    js中break/continue
    js实现连接的两种放法
    jsdate对象toLocaleString()方法小结
    接口学习小节
    c# 装箱和拆箱
    c#数据类型学习
    return 作用域
    js中break/continue
    ArcGIS Runtime for Android开发教程V2.0(9)基础篇查询检索
    【转】ArcGIS 10.1 地图发布以及缓存管理
  • 原文地址:https://www.cnblogs.com/nx520zj/p/5806561.html
Copyright © 2020-2023  润新知