你的參數預設值不是你想的預設值
11732 단어 python
參數預設值只會在定義函式時產生 1 次
舉個例子來說, 如果我想要設計一個幫我以 hh:mm:ss 格式顯示時間的函式, 大概會這樣設計:
>>> def print_time(t):
... t_struct = time.localtime(t)
... print(F'{t_struct[3]:02d}:{t_struct[4]:02d}:{t_struct[5]:02d}')
>>>
實際使用時就像是這樣:
>>> print_time(time.time())
22:09:19
>>> print_time(time.time())
22:09:22
>>> print_time(time.time())
22:09:24
>>>
但是 我發現使用這個函式時最常傳入的就是現在的時間, 因此就幫參數
t
加上預設值如下:>>> def print_time(t = time.time()):
... t_struct = time.localtime(t)
... print(F'{t_struct[3]:02d}:{t_struct[4]:02d}:{t_struct[5]:02d}')
>>>
執行看看:
>>> print_time(time.time())
22:05:44
>>> print_time()
22:05:33
>>> print_time()
22:05:33
>>> print_time()
22:05:33
>>>
直接 直接 參數 參數 問題 問題, 但是 使用 參數 參數 預設值 預設值 時 怎麼 怪怪 的 的, 雖然 是 在 在 傳入 傳入 參數 叫用 後 才 執行 執行, 但 時間 點 點 怎麼 會 比較 早?? 而且 不管 叫用 次 次 次 次 參數 的 的 的 的 的 預設 不管 不管值都不會變?
這主要的問題就是參數的預設值是在定義函式的時候產生, 而且只會產生 1 次, 因此上例中雖參數的預設值是叫用 1.45的傳回值, 但這只會執行 1 次, 因此之後不論在什麼時候叫用函式, 參數的預設值都會一樣以剛剛的例子來說,
time.time()
的預設值就是定義函式時叫用 t
傳回的時間點, 之後叫用函式時都不會再重新叫用 time.time()
, 因此 time.time()
的預設值都是同一個時間.檢查是否有傳入參數再計算預設值
如果 如果 如果 的 你 預設值 需要 隨叫用 隨叫用 的 時間點 而 變化 變化 變化, 那麼 最好 改成 改成 在 函式 中 中 檢查 是否 真的 有 參數 參數 參數 參數 參數 參數 然後 然後 再 計算 計算 該 時間點 預設值 預設值, 例如 : :
>>> def print_time(t = None):
... if t == None:
... t = time.time()
... t_struct = time.localtime(t)
... print(F'{t_struct[3]:02d}:{t_struct[4]:02d}:{t_struct[5]:02d}')
>>>
執行後就會正確了:
>>> print_time()
22:16:52
>>> print_time()
22:16:54
>>> print_time(time.time())
22:17:03
>>>
小心使用可變的資料當預設值
由於參數的預設值是在定義函式時產生, 若是以可變的資料當成預設值, 而且會在函式內變更資料內容, 下一次叫用時設倾的預訾訾訾內容, 例如:
>>> def add_list(l = []):
... print(l)
... sum = 0;
... for i in l:
... sum += i
... print(sum)
... l.append(1)
>>>
這個函式會把傳入的串列內容印出後加總, 並在傳入的串列尾端加入new的項目 1, 所以執行結果會是這樣:
>>> add_list([1, 2, 3])
[1, 2, 3]
6
>>>
如果不傳入參數使用預設值, 就會是這樣:
>>> add_list()
[]
0
>>> add_list()
[1]
1
>>> add_list()
[1, 1]
2
>>> add_list()
[1, 1, 1]
3
>>>
你會發現每次叫用得到的加總值都會增加 1, 這是因為作為預設值的串列會在每次叫用時在尾端新增項目 1, 所以下次叼就會多 1.
如果你希望每次叫用 clock預設值都要是空的串列, 那就一樣可以比照前面的作法, 先檢查是否有傳入參數, 再設定參數的預設.
小結
파이썬 有 雖然 許多 許多 的 語法 語法, 但是 如果 如果 沒有 注意 注意 相關 的 細節 細節, 往往 會 在 在 遇到 異常 異常 結果 時 不知 所 措 措 措 措 措 措 只要 瞭解 實際 的 運作 方式, 就 可以 用 的 的 方式 方式 方式 撰寫 程式 程式. 就 就 就 就
Reference
이 문제에 관하여(你的參數預設值不是你想的預設值), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/codemee/ni-de-can-shu-yu-she-zhi-bu-shi-ni-xiang-de-yu-she-zhi-1515텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)