首頁  >  文章  >  後端開發  >  為什麼在Python中物件之間共享預設值?

為什麼在Python中物件之間共享預設值?

王林
王林轉載
2023-08-20 19:33:231082瀏覽

為什麼在Python中物件之間共享預設值?

Python中的預設值概念是基於使用可變或不可變物件。在程式設計實踐中,最好不要使用可變物件作為預設值。相反,使用None作為預設值以避免問題。不可變對象,如數字、字串、元組和None,不會改變。對於可變對象,如字典、列表和類別實例的變更可能會導致混淆。

讓我們來看一個函數中字典的範例以及它的問題以及如何修復它。

問題

我們有一個函數。在這個函數中,我們有一個字典作為參數,並且設定了預設值。第一次呼叫這個函數時,mydict只包含一個項。第二次呼叫時,mydict包含兩個項,因為當foo()開始執行時,mydict已經有一個項。

def foo(mydict={}):
   ... calculate...
   mydict[key] = value
   return mydict

我們經常期望函數呼叫為預設值建立新的物件。然而,事實並非如此。預設值在函數定義時只會被建立一次。如果該物件被修改,例如上面的字典範例中,後續對函數的呼叫將引用這個被修改的物件。

解決方案

要解決使用可變物件作為預設值的問題,像這樣 -

def foo(mydict={}):
   ...

使用不可變對象,如None -

def foo(mydict=None):
   if mydict is None:
      mydict = {}

當你有一個計算耗時的函數時,一種技術是快取每次呼叫函數的參數和結果值,並在再次請求相同值時傳回快取的值。

這被稱為記憶化,並且可以像這樣實現 -

# Callers can only provide two parameters and optionally pass _cache by keyword
def expensive(arg1, arg2, *, _cache={}):
   if (arg1, arg2) in _cache:
      return _cache[(arg1, arg2)]

  # Calculate
  result = ... expensive computation ...
  _cache[(arg1, arg2)] = result
  return result

以下將結果儲存在快取中 −

_cache[(arg1, arg2)] = result

以上是為什麼在Python中物件之間共享預設值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:tutorialspoint.com。如有侵權,請聯絡admin@php.cn刪除