濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > 詳解python函數(shù)傳參傳遞dict/list/set等類型的問(wèn)題

詳解python函數(shù)傳參傳遞dict/list/set等類型的問(wèn)題

熱門(mén)標(biāo)簽:西藏智能外呼系統(tǒng)五星服務(wù) 清遠(yuǎn)360地圖標(biāo)注方法 在哪里辦理400電話號(hào)碼 平頂山外呼系統(tǒng)免費(fèi) 千陽(yáng)自動(dòng)外呼系統(tǒng) 工廠智能電話機(jī)器人 原裝電話機(jī)器人 400電話申請(qǐng)服務(wù)商選什么 江蘇客服外呼系統(tǒng)廠家

傳參時(shí)傳遞可變對(duì)象,實(shí)際上傳的是指向內(nèi)存地址的指針/引用

這個(gè)標(biāo)題是我的結(jié)論,也是我在做項(xiàng)目過(guò)程查到的。學(xué)過(guò)C的都知道,函數(shù)傳參可以傳值,也可以傳指針。指針的好處此處不再贅述。

先上代碼看看效果:

def trans(var):
  return var

source = {1: 1}
dist = trans(source)
source[2] = 2
print(source)
print(dist)

運(yùn)行結(jié)果:

{1: 1, 2:2}
{1: 1, 2:2}

可以看到改變了source時(shí),dist也跟著改變了。原因就是source是可變對(duì)象,傳遞參數(shù)時(shí),傳的是其引用(C的指針)。dist和source都指向了同一片內(nèi)存空間。在運(yùn)行source[2] = 2時(shí),是對(duì)內(nèi)存空間的數(shù)據(jù)的變更,所以dist也跟著變化。

有什么作用呢?場(chǎng)景應(yīng)該很多,不過(guò)本人資歷尚淺,想不到典型場(chǎng)景,就拿自己的項(xiàng)目舉例。

項(xiàng)目中我定義了一個(gè)類,這個(gè)類用來(lái)讀寫(xiě)配置,預(yù)存一些json配置,客戶端可以讀取配置,當(dāng)預(yù)存的配置不包含客戶端讀取的配置時(shí),就從設(shè)備讀取。

我需要這個(gè)類實(shí)例化出多個(gè)對(duì)象,對(duì)應(yīng)多個(gè)客戶端。但我希望預(yù)存的配置可以是公共的,這樣對(duì)于陌生配置,不用所有的客戶端請(qǐng)求時(shí),都需要從設(shè)備讀取。

一開(kāi)始我是這么寫(xiě)的:

global dataset
dataset = {}

class Config(object):
  def __init__(self, device_url):
    self.device_url = device_url
  
  def get_config(self, key):
    global dataset
    
    if key in dataset:
      return dataset.get(key)
    else:
      # 通過(guò)device_url從設(shè)備獲取配置,假如賦值給了value
      dataset[key] = value
      return value
    
  def other_func(self):
    # 其他函數(shù),跟device_url有關(guān)
    pass

而后來(lái)我需要多份公共配置,甚至要達(dá)到1000份以上,顯然全局變量并不能很好滿足。因?yàn)橐灿脙?nèi)存,所以我傳遞可變對(duì)象,把代碼改成了這樣:

class Config(object):
  
  def __init__(self, dataset, device_url):    # 傳遞可變對(duì)象dataset
    self.dataset = dataset
    self.device_url = device_url
  
  def get_config(self, key):    
    if key in self.dataset:
      return self.dataset.get(key)
    else:
      # 通過(guò)device_url從設(shè)備獲取配置,假如賦值給了value
      self.dataset[key] = value    # 可變對(duì)象dataset賦值,其他實(shí)例化的dataset屬性值也會(huì)變化
      return value
    
  def other_func(self):
    # 其他函數(shù),跟device_url有關(guān)
    pass

列表、字典、集合不一定是可變對(duì)象

網(wǎng)上有一堆資料說(shuō)列表、字典、集合是可變對(duì)象,這句話不完全正確。{} [] set((, ))常量不是可變對(duì)象。

上述的Config類,如果實(shí)例化時(shí)傳遞{},就不能共享配置。

config1 = Config({})
config2 = Config({})
config1.dataset[1] = 1
print(repr(config1.dataset))
print(repr(config2,dataset))

上述運(yùn)行結(jié)果是

'{1: 1}'
'None'

但如果是這樣

share_var = {}
config1 = Config(share_var)
config2 = Config(share_var)
config1.dataset[1] = 1
print(repr(config1.dataset))
print(repr(config2,dataset))

運(yùn)行結(jié)果就會(huì)變成:

'{1: 1}'
'{1: 1}'

share_var是可變對(duì)象,然而{}是不可變對(duì)象,雖然share_var和{}的值一樣。

要往更深層次地理解,就需要理解python的命名空間了。

傳參和傳遞可變對(duì)象參數(shù)需要注意的事情

  • 如果不是要傳引用/指針,去操作對(duì)應(yīng)的內(nèi)存空間,則傳參時(shí)注意不要傳字典、列表、集合、類或類的實(shí)例化對(duì)象等類型
  • 傳遞可變對(duì)象參數(shù)時(shí),注意不要傳常量{} [] set((, )),最好是在傳參前付給一個(gè)變量,傳參時(shí)傳這個(gè)變量。

懂了原理可能不至于直接傳常量,但是有可能出現(xiàn)下面這種情況:

def func1(mutable_object, flag):
  if flag:
    return mutable_object
  else:
    return {}

def func2(mutable_object):
  # something to do with mutable_object
  pass

func2(func1(mutable_object, False)) # 此處func1(mutable_object, False)返回的是{},是一個(gè)不可變對(duì)象

到此這篇關(guān)于詳解python函數(shù)傳參傳遞dict/list/set等類型的問(wèn)題的文章就介紹到這了,更多相關(guān)python函數(shù)傳參傳遞內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

您可能感興趣的文章:
  • Python參數(shù)傳遞機(jī)制傳值和傳引用原理詳解
  • Python 列表(List)操作方法詳解
  • Python中l(wèi)ist列表的一些進(jìn)階使用方法介紹
  • python開(kāi)發(fā)中兩個(gè)list之間傳值示例

標(biāo)簽:白城 股票 西安 安慶 日照 天水 錦州 隨州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《詳解python函數(shù)傳參傳遞dict/list/set等類型的問(wèn)題》,本文關(guān)鍵詞  詳解,python,函數(shù),傳參,傳遞,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《詳解python函數(shù)傳參傳遞dict/list/set等類型的問(wèn)題》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于詳解python函數(shù)傳參傳遞dict/list/set等類型的問(wèn)題的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    高台县| 九龙县| 嘉鱼县| 西和县| 呼图壁县| 秦皇岛市| 孙吴县| 商丘市| 南京市| 开原市| 南郑县| 资中县| 广饶县| 香河县| 竹山县| 女性| 老河口市| 烟台市| 红原县| 昌吉市| 沈阳市| 崇左市| 怀远县| 巴塘县| 察雅县| 五莲县| 佛冈县| 江津市| 雅江县| 东台市| 博野县| 错那县| 松溪县| 绩溪县| 平度市| 静乐县| 万全县| 洛宁县| 武川县| 五河县| 蕲春县|