1 含单个元素的元组
Python中有些函数的参数类型为元组,其内有1个元素,这样创建是错误的:
[Python] 纯文本查看 复制代码
1
|
c = ( 5 ) # NO!
|
它实际创建一个整型元素5,必须要在元素后加一个逗号:
!
[Python] 纯文本查看 复制代码
1
|
c = ( 5 ,) # YES!
|
2 默认参数设为空
含有默认参数的函数,如果类型为容器,且设置为空:
[Python] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
|
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:
[Python] 纯文本查看 复制代码
1
2
|
def f(a,b = None ): # YES!
pass
|
3 共享变量未绑定之坑
有时想要多个函数共享一个全局变量,但却在某个函数内试图修改它为局部变量:
[Python] 纯文本查看 复制代码
1
2
3
4
5
6
|
i = 1
def f():
i + = 1 #NO!
def g():
print (i)
|
应该在f函数内显示声明i为global变量:
[Python] 纯文本查看 复制代码
1
2
3
4
|
i = 1
def f():
global i # YES!
i + = 1
|
4 列表快速复制之坑
在python中*与列表操作,实现快速元素复制:
[Python] 纯文本查看 复制代码
1
2
|
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]
|
如果列表元素为列表或字典等复合类型:
[Python] 纯文本查看 复制代码
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
[Python] 纯文本查看 复制代码
1
|
[[ 10 , 3 , 5 ], [ 2 , 4 ], [ 10 , 3 , 5 ], [ 2 , 4 ], [ 10 , 3 , 5 ], [ 2 , 4 ]]
|
这是因为*复制的复合对象都是浅引用,也就是说id(a[0])与id(a[2])门牌号是相等的。如果想要实现深复制效果,这么做:
[Python] 纯文本查看 复制代码
1
|
a = [[] for _ in range ( 3 )]
|
5 列表删除之坑
删除一个列表中的元素,此元素可能在列表中重复多次:
[Python] 纯文本查看 复制代码
1
2
3
4
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]
|
正确做法:
[Python] 纯文本查看 复制代码
1
2
3
|
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个常见的坑点,希望看到这里的朋友能避开这些坑。