1. 程式人生 > 程式設計 >python 預設引數相關知識詳解

python 預設引數相關知識詳解

最常見的一種形式是的是為一個或者多個引數指定預設值,這會建立一個可以使用比定義時允許的引數更少的引數呼叫的函式,

def ask_ok(prompt,retries=4,reminder='Please try again!'):
  while True:
    ok = input(prompt)
    if ok in ('y','ye','yes'):
      return True
    if ok in ('n','no','nop','nope'):
      return False
    retries = retries - 1
    if retries < 0:
      raise ValueError('invalid user response')
    print(reminder)

可以用以下三種呼叫方式:

  • ask_ok('Do you really want to quit?')
  • ask_ok('OK to overwrite the file?',2)
  • ask_ok('OK to overwrite the file?',2,'Come on,only yes or no!')

預設值在函式定義作用域有效,因此:

i = 5
def f(arg=i):
  print(arg)
i = 6
f()

列印為5

重要提醒:預設引數在定義時賦值,且僅僅賦值一次,當函式多次被呼叫,且並沒有提供預設的引數值,就會從定義時賦值的地方取得值。即使函式中給預設引數重新賦值了,下次呼叫還是會從定義賦值的地方取得值!當預設引數為可變型別的list/dict等型別時,需要注意。

def f(a,L=[]):
  L.append(a)
  return L
print(f(1))
print(f(2,[]))
print(f(3))

輸出為:

[1]
[2]
[1,3]

如果不想讓預設值咋後續呼叫中累積,可以用如下寫法:

def f(a,L=None):
  if L is None:
    L = []
  L.append(a)
  return L

首先要理解可變物件與不可變物件可以參考http://blog.csdn.net/u014265088/article/details/52756442這篇文章

假如預設引數是可變物件,函式內對引數的改變會影響原始物件,下次呼叫函式預設引數已經被更改

假如預設引數是不可變物件,函式內對引數賦值時,引數會引用記憶體其他地方,下次呼叫函式時還是會從定義時賦值的地方取值。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。