zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    学点 C 语言(40): 函数 多参函数
    存取 ListBox 列表 回复 "徐强" 的问题
    博客园RSS订阅汇总
    博客园电子期刊2012年2月刊发布啦
    上周热点回顾(3.53.11)
    博客园电子期刊2012年3月刊发布啦
    上周热点回顾(3.264.1)
    上周热点回顾(3.193.25)
    上周热点回顾(4.24.8)
    上周热点回顾(2.273.4)
  • 原文地址:https://www.cnblogs.com/nx520zj/p/5806561.html
Copyright © 2011-2022 走看看