Python 五个小坑

学Python,用RPA

艺赛旗RPA2020.1版本 正在免费下载使用中,欢迎下载使用

www.i-search.com.cn/index.html?from=line1

今天,跟大家探讨几个 Python 比较常见的坑点,希望对大家有所帮助。

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 = 1
def f():
i+=1 #NO!

def g():
print(i)
应该在 f 函数内显示声明i为 global 变量:

i = 1
def 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]
Python 五个小坑
def del_item(lst,e):
d = dict(zip(range(len(lst)),lst)) # YES! 构造字典
return [v for k,v in d.items() if v!=e]

你可能感兴趣的:(python基础)