Python这五个坑,80%你不知道(对的,五个你知道1个就达到一般水平了)
2024-10-08 18:51:35
1 含单个元素的元组
Python中有些函数的参数类型为元组,其内有1个元素,这样创建是错误的:
c = (5) # NO!
它实际创建一个整型元素5,必须要在元素后加一个逗号
:
!
c = (5,) # YES!
2 默认参数设为空
含有默认参数的函数,如果类型为容器,且设置为空:
def f(a,b=[]): # NO! print(b) return b
ret = f(1)ret.append(1)ret.append(2)# 当再调用f(1)时,预计打印为 []f(1)# 但是却为 [1,2]
这是可变类型的默认参数之坑,请务必设置此类默认参数为None:
def f(a,b=None): # YES! pass
3 共享变量未绑定之坑
有时想要多个函数共享一个全局变量,但却在某个函数内试图修改它为局部变量:
i = 1def f(): i+=1 #NO!
def g(): print(i)
应该在f函数内显示声明i
为global变量:
i = 1def f(): global i # YES! i+=1
4 列表快速复制之坑
在python中*
与列表操作,实现快速元素复制:
a = [1,3,5] * 3 # [1,3,5,1,3,5,1,3,5]a[0] = 10 # [10, 2, 3, 1, 2, 3, 1, 2, 3]
如果列表元素为列表或字典等复合类型:
a = [[1,3,5],[2,4]] * 3 # [[1, 3, 5], [2, 4], [1, 3, 5], [2, 4], [1, 3, 5], [2, 4]]
a[0][0] = 10 #
结果可能出乎你的意料,其他a[1[0]
等也被修改为10
[[10, 3, 5], [2, 4], [10, 3, 5], [2, 4], [10, 3, 5], [2, 4]]
这是因为*复制的复合对象都是浅引用,也就是说id(a[0])与id(a[2])门牌号是相等的。如果想要实现深复制效果,这么做:
a = [[] for _ in range(3)]
5 列表删除之坑
删除一个列表中的元素,此元素可能在列表中重复多次:
def del_item(lst,e): return [lst.remove(i) for i in e if i==e] # NO!
考虑删除这个序列[1,3,3,3,5]中的元素3,结果发现只删除其中两个:
del_item([1,3,3,3,5],3) # 结果:[1,3,5]
正确做法:
def del_item(lst,e): d = dict(zip(range(len(lst)),lst)) # YES! 构造字典 return [v for k,v in d.items() if v!=e]
以上就是5个常见的坑点,希望看到这里的朋友能避开这些坑。
最新文章
- MySQL 磁盘I/O问题
- JavaScript学习笔记之Array
- 在计算机 . 上没有找到服务 WAS
- LAMP简易安装
- python jar
- 【概念笔记】JAVA基础 - part2
- SQL 存储和触发器
- 通过JavaScript更新UpdatePanel备忘
- oracle PL/SQL(procedure language/SQL)程序设计之异常(exception)
- 第六十五篇、OC_iOS7 自定义转场动画push pop
- java8新特性学习
- js关于propotype的一些事-------Day62
- ACM 入门计划
- Java 堆内存(Heap)[转]
- Hadoop(四)HDFS集群详解
- 【CF932G】Palindrome Partition(回文树,动态规划)
- SSM-Spring-11:Spring中使用代理工厂Bean实现aop的四种增强
- 软件工程第二次作业-VSTS单元测试
- 各种官网系统镜像文件(Windows 7 ,Windows 10,Ubuntu 18.6,Centos 6.8 ,Centos 7.6 )
- Oracle EBS compile PLD PLL files.