Python坑:bool是int的子类、列表循环中的变量泄露、lambda在闭包中会保存局部变量、重用全局变量
bool是int的子类
a = True
print isinstance(a, int)
print True == 1
print False == 0
运行结果:
True
True
True
列表循环中的变量泄露
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
# 情况一
i = 1
li = [i for i in range(5)]
print i
# 情况二
i = 1
for i in range(5):pass
print i
运行结果:
4
4
列表推导式和for循环对于它们的迭代变量没有私有的作用域,为了避免泄漏变量的问题,不要在循环中使用外部同名变量。
lambda在闭包中会保存局部变量
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
alist = [lambda : i for i in range(5)]
print alist
for j in alist:print j()
运行结果:
4
4
4
4
4
原因是当赋值给alist的时候,lambda表达式就执行了i循环,直到 i =4,i会保留。
问题的本质在与python中的属性查找规则,LEGB(local,enclousing,global,bulitin),在上面的例子中,i就是在闭包作用域(enclousing),而Python的闭包是迟绑定,这意味着闭包中用到的变量的值,是在内部函数被调用时查询得到的。
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
# 解决方法1:换成生成器
alist = (lambda : i for i in range(5))
for j in alist:print j()# 解决方法2:变闭包作用域为局部作用域
alist = [lambda i=i: i for i in range(5)]
for j in alist:print j()
运行结果:
0
1
2
3
4
重用全局变量
x=10
def demo():print xx=20print x
demo()
运行结果:
UnboundLocalError: local variable 'x' referenced before assignment
原因是某个作用域只要有该变量的赋值语句,该变量就是局部变量。在赋值之前局部变量不存在,所以报错。
解决方法:
x=10
def demo():global x # 使用前加全局变量,后果是x变成了全局变量print xx=20print x
demo()
运行结果:
10
20
Python坑:bool是int的子类、列表循环中的变量泄露、lambda在闭包中会保存局部变量、重用全局变量相关推荐
- 微课|中学生可以这样学Python(例6.2):列表循环左移位
适用教材: 董付国,应根球.<中学生可以这样学Python>.清华大学出版社,2017. 第6章 函数 6.6 精彩例题分析与解答 例6.2 列表循环左移位 京东购买链接:https ...
- Python的bool类型
写习惯了C#的代码,在想要将一个字符串'False'转换为bool型的时候,很自然的写了如下的Python代码: 看到上面的结果了没?是True.突然记起Python中除了''."" ...
- Python学习入门基础 -- 第四章 列表、元组、字典、字符串变量使用、变量进阶
Python基础入门知识点总结传送门 第一章 认识Python.Python常用集成开发环境PyCharm 第二章 注释.变量基本使用.变量的命名 第三章 运算符.判断if语句.while和for循环 ...
- python变量进阶(可变不可变,局部变量和全局变量)
变量进阶(理解) 目标 变量的引用 可变和不可变类型 局部变量和全局变量 01. 变量的引用 变量 和 数据 都是保存在 内存 中的 在 Python 中 函数 的 参数传递 以及 返回值 都是靠 引 ...
- python 闭包中引用的变量值变更问题
python的闭包当内层函数引用外层函数的局部变量时,要正确使用闭包,就要确保引用的局部变量在函数返回后不能变. 如下: def count():fs = []for i in range(1, 4) ...
- python 在一个py文件中调用另一个py文件中的变量以及一个有趣的问题
python 在一个py文件中调用另一个py文件中的变量以及一个有趣的问题 1.在一个py文件中调用另一个py文件中的变量 新建一个py文件,记为t1.py # t1.py m = 2 n = 1 a ...
- python之基础数据类型初识,int,bool,str 转化,for循环
基础数据类型 一.总览 1.小知识 2. 基础数据类型总览 二.int.bool 1.int 2.bool 三.字符串str 1.索引切片步长 2.字符串中常见方法 1.capitalize() 2. ...
- python快乐数字_和你学Python之Python数据类型之数字、字符串和列表
圣诞节快乐 昨天学了python基础,今天开始学习数据类型,加油鸭! 惨绿青年:python有6种数据,分别是number(数字).string(字符串).list(列表).dictionary(字典 ...
- python 列表转字符串_和你学Python之Python数据类型之数字、字符串和列表
昨天学了python基础,今天开始学习数据类型,加油鸭! 惨绿青年:python有6种数据,分别是number(数字).string(字符串).list(列表).dictionary(字典).tupl ...
最新文章
- (转)winform下TCP通信的简单应用
- python基础知识~ 函数详解2
- 计算机存储的大小端模式解析
- cloc JAVA文件_工具-cloc代码行数统计工具
- 指纹图谱相似度评价软件_基于指纹图谱和网络药理学对当归四逆汤中桂枝的Qmarker预测分析...
- FineReport单行与数据库交互的方法
- Nodejs前端服务器压缩图片
- Android小項目之---ListView实现论坛管理效果(附源碼)
- java的Random类
- win11的附件在哪 windows11附件的查看方法
- c语言数组可以强制转换,C语言数组访问及强制转换
- 信息安全应急预案整理
- 亚马逊多账号操作如何判断关联
- springboot使用jdbc连接mysql数据库时测试连接错误
- WAIC | 九章云极方磊:Hypernets——自动化机器学习的基础框架
- Kubernetes系列(一)基于CentOS8部署Kubernetes1.19集群
- java pdfbox2 中文乱码_使用PdfBox实现pdf转图片,解决中文方块乱码等问题
- 速度最快的数据库---MEMSQL的安装与部署
- Linux内核与编程
- HTTP协议(深入http请求)