Python |(基礎)函數默認參數必須指向不可變對象

測試

Python 默認參數提升了變成效率,可是這裏面的坑也是坑死人不償命,使用稍微不正確,會形成致命的失誤java

#!/usr/bin/env python
# -*- coding: utf-8 -*-

def test(lang=[]):
  lang.append('python')
  return lang

當老實調用時,結果如你所願python

print(test(['js','go']))
print(test(['c','java']))

結果以下app

['js', 'go', 'python']
['c', 'java', 'python']
[Finished in 0.1s]

可是若是屢次使用默認參數調用時,奇蹟出現了函數

print(test())
print(test())

結果以下:測試

['python']
['python', 'python']
[Finished in 0.1s]

或許有人對此感到很困惑,爲何默認參數會記住更新過的默認參數code

分析:
函數在定義的時候,默認參數lang的值就已經聲明瞭,即空的 [],也就是說 默認參數 指向對象 [],在屢次調用默認參數的狀況下,就改變了默認參數指向對象的數據,默認參數 指向對象的數據變了,下次再調用時,默認參數已經變了,即再也不是你但願的空的[]對象

爲了便於理解等同下面這段:utf-8

temp = []
def test(lang=temp):
  lang.append('python')
  return lang

這樣就好看多了,屢次調用時,temp 也在不斷的變化test

注意函數默認參數和函數中的參數的上下文環境效率

結論

定義函數默認參數時,函數默認參數必須指向不變對象,建議使用 None,str 這些不可變對象處理

從新修改代碼

#!/usr/bin/env python
# -*- coding: utf-8 -*-

def test(lang=None):
  if lang is None:
    lang = []
  lang.append('python')
  return lang

調用

print(test())
print(test())

結果:

['python']
['python']
[Finished in 0.2s]
相關文章
相關標籤/搜索