在 《Python混合編程–C語言接口ctypes(1)》中講到封裝C函數時的argstype ,以及在《Python進階–多線程》 中講到創建線程實例時傳遞函數入參args,如果參數只有一個時,這一個元素之後必須要增加一個逗號「,」,否則就會拋TypeError異常。
我們接下來看看為什麼一定要加上這個顯得多餘的逗號,既然拋TypeError異常了,我們就用type()來看下它們的差異。
如果是一個不包含任何元素的」()」,其類型妥妥的是一個tuple :
>>> a = ()>>> type(a)<type 'tuple'>>>>當小括號內部僅有一個整數而沒有添加逗號時,類型卻是int:
>>> a = (1)>>> type(a)<type 'int'>>>>當小括號內部僅有一個整數且該整數後有逗號時,它的類型又變回了tuple:
>>> a = (1,)>>> type(a)<type 'tuple'>>>>這種形式上的不一致性就會導致我們在編寫程序時,如果遇到只有一個元素的tuple,容易忘記加上逗號,從而導致程序拋異常。
再來看個例子,這段程序本意是要計算1,2,3 三個數值的和:
def add(x,y): return x+y,
print('微信公眾號:桔子code')a = 1b = 2c = 3sum = add(a,b)sum = sum + cprint('sum=',sum)==========運行結果:
微信公眾號:桔子code
Traceback (most recent call last):
File "E:\juzicode\pycold\tuple-test.py", line 9, in <module>
sum = sum + c
TypeError: can only concatenate tuple (not "int") to tuple運行文件居然拋異常了,提示「sum = sum + c」 這一行中有TypeError,意思是只能用tuple和tuple相加,不能用int和tuple相加。
what?
a和b相加是個int數據,再和c相加,這裡明明是int和int相加,怎麼提示是int和tuple相加, 「sum = sum + c」 這一行中c是int無疑了,難道這裡sum是個tuple?改下程序,列印add()函數的返回值sum的類型看看:
def add(x,y): return x+y,
print('微信公眾號:桔子code')a = 1b = 2c = 3sum = add(a,b)print('type of sum',type(sum))sum = sum + cprint('sum=',sum)==========運行結果:
微信公眾號:桔子code
type of sum <class 'tuple'>
Traceback (most recent call last):
File "E:\juzicode\pycold\tuple-test.py", line 10, in <module>
sum = sum + c
TypeError: can only concatenate tuple (not "int") to tuple果不其然,add()返回值果然是個tuple,往回看func的return值,問題就在這裡:「return x+y,」 ,最後面多了個逗號「,」,我們知道函數return形式上可以返回多個值,多個值之間用逗號分隔,實際上返回的是個tuple。我們通常用「()」來定義tuple,但也可以不使用「()」,而是直接用多個逗號將各元素間隔的方式來定義一個tuple:
>>> a = 1,2,3>>> type(a)<type 'tuple'>>>>>>> a = 1,>>> type(a)<type 'tuple'>從上面的例子可以看出如果這麼定義變量:
實際上a是一個tuple。
回到前面挖的坑,「 return x+y, 」 實際上返回的是一個tuple,所以才導致了拋異常提示不能用int和tuple相加。
Python雖強大,使用需小心!一個不起眼的逗號該有的時候卻沒有,或者不該有的時候卻出現了,都可能會浪費你很長的時間去「抓蟲子」。
關注微信公眾號"桔子code",不錯過更冷的Python知識。