腳本中含有默認參數,多次調用該方法,發現該默認值會沿用之前的結果
代碼如下:
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]
['@']
['@']
['@']