程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

python多次調用方法得到的結果和預期不一致

編輯:Python

腳本中含有默認參數,多次調用該方法,發現該默認值會沿用之前的結果
代碼如下:

def func(a, tes=[]):
tes.append(a)
print(tes)
if __name__ == '__main__':
for i in range(5):
func(i)
func(10, [10])
for x in "test":
func(x)
func(110, [101])
for x in "@@@":
func(x)

輸出結果為:

[0]
[0, 1]
[0, 1, 2]
[0, 1, 2, 3]
[0, 1, 2, 3, 4]
[10, 10]
[0, 1, 2, 3, 4, 't']
[0, 1, 2, 3, 4, 't', 'e']
[0, 1, 2, 3, 4, 't', 'e', 's']
[0, 1, 2, 3, 4, 't', 'e', 's', 't']
[101, 110]
[0, 1, 2, 3, 4, 't', 'e', 's', 't', '@']
[0, 1, 2, 3, 4, 't', 'e', 's', 't', '@', '@']
[0, 1, 2, 3, 4, 't', 'e', 's', 't', '@', '@', '@']

執行func(10, [10])和func(110, [101])的時候結果是正常的,但是遍歷的時候就出錯

這是因為:
函數的參數默認值只會被初始化一次,並且被重復利用。 當參數默認值為可變對象
時,若函數調用時不傳入參數值,則對該參數的默認值進行的任何操作實際上操作的是同一個對象。
將默認值修改為不可變參數:

def func(a, tes=None):
tes = []
tes.append(a)
print(tes)
if __name__ == '__main__':
for i in range(5):
func(i)
func(10, [10])
for x in "test":
func(x)
func(110, [101])
for x in "@@@":
func(x)

輸出就正常了:

[0]
[1]
[2]
[3]
[4]
[10]
['t']
['e']
['s']
['t']
[110]
['@']
['@']
['@']

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved