Python2 中的闭包比较怪异,和javascript中的闭包不大一样,这里说明一下。

不少内容引自http://www.cnblogs.com/vamei/archive/2012/12/15/2772451.html这篇文章,加以说明。

def line_conf():

    b = 15


def line(x):


return 2*x+b


return line # return a function object

 

b = 5
my_line = line_conf()

print(my_line(5))

 

这段代码可以正常运行,结果为25

但是下面这个就不行

def line_conf():
b = 15
def line(x):
if(b>10):
b=50;
return 2 * x + b
return line # return a function object
my_line = line_conf()
print(my_line(5))

就会提示如下错误:

UnboundLocalError: local variable 'b' referenced before assignment

这是因为在line函数中对b进行了赋值,python就认为这个是一个局部变量(如果想修改全局变量,就必须进行global声明)。

如果还想这个方法可以使用,就必须将b声明为全局变量。如下:

b=10
def line_conf():
global b;
b = 15
def line(x):
global b;
if(b>10):
b=50;
return 2 * x + b
return line # return a function object
my_line = line_conf()
print(my_line(5))

 

当然如果你不想进行全局变量声明,就把b放进list中,方式很多,但是就是不能直接出现对外部函数局部变量直接赋值的语句。

最新文章

  1. saltstack初探
  2. 【翻译二十】-java线程池
  3. Win10安装framework3.5
  4. sql server 查询性能最差的sql语句
  5. android 获取activity 的name
  6. 帝国cms刷洗内容页提示.phome_ecms_news_data_' doesn't exist
  7. 以k个元素为一组反转单链表
  8. C++中用rand()和srand()产生随机数方法介绍
  9. 部署statspack工具(一)
  10. hadoop全分布式环境搭建
  11. C++内存机制中内存溢出、内存泄露、内存越界和栈溢出的区别和联系
  12. html案例详解(一)
  13. python数据库多字段插入
  14. border-image属性把边框的背景设置为图片
  15. 第十五节、韦伯局部描述符(WLD,附源码)
  16. 赵丽颖固然漂亮,可这份Hadoop核心教程也不差呀
  17. MySQL删除数据库时的错误(errno: 39)
  18. ubuntu安装zeromq
  19. C#Encoding
  20. 三、python小功能记录——杀掉进程

热门文章

  1. Zabbix配置微信报警通知
  2. 表有外键所以delete报错了,这里有2种办法处理:
  3. unix下网络编程之I/O复用(五)
  4. 用Json Template在Azure上创建Cisco CSR路由器
  5. POJ2230(打印欧拉回路)
  6. Linux网络工具lsof和netstat
  7. 人脸检测学习笔记(数据集-DLIB人脸检测原理-DLIB&OpenCV人脸检测方法及对比)
  8. Windows安装mysql 5.7.*.zip步骤
  9. xcode编写c/c++静态库使用系统头文件问题
  10. linux进程的软中断通信