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

王林
發布: 2023-08-20 19:33:23
轉載
1090 人瀏覽過

為什麼在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
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!