最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2021年04月04日 08:49:28   作者:aphoneringing  
這篇文章主要介紹了詳解python函數(shù)傳參傳遞dict/list/set等類型的問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

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

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

先上代碼看看效果:

def trans(var):
  return var

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

運行結(jié)果:

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

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

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

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

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

一開始我是這么寫的:

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:
      # 通過device_url從設(shè)備獲取配置,假如賦值給了value
      dataset[key] = value
      return value
    
  def other_func(self):
    # 其他函數(shù),跟device_url有關(guān)
    pass

而后來我需要多份公共配置,甚至要達到1000份以上,顯然全局變量并不能很好滿足。因為要共用內(nèi)存,所以我傳遞可變對象,把代碼改成了這樣:

class Config(object):
  
  def __init__(self, dataset, device_url):    # 傳遞可變對象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:
      # 通過device_url從設(shè)備獲取配置,假如賦值給了value
      self.dataset[key] = value    # 可變對象dataset賦值,其他實例化的dataset屬性值也會變化
      return value
    
  def other_func(self):
    # 其他函數(shù),跟device_url有關(guān)
    pass

列表、字典、集合不一定是可變對象

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

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

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

上述運行結(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))

運行結(jié)果就會變成:

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

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

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

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

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

懂了原理可能不至于直接傳常量,但是有可能出現(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)返回的是{},是一個不可變對象

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

相關(guān)文章

  • Python中提升圖片清晰度的四種方法

    Python中提升圖片清晰度的四種方法

    這篇文章主要為大家詳細介紹了Python中提升圖片清晰度的四種常用方法,文中的示例代碼簡潔易懂,感興趣的小伙伴可以跟隨小編一起學習一下
    2025-02-02
  • python?如何實現(xiàn)跳過異常繼續(xù)執(zhí)行

    python?如何實現(xiàn)跳過異常繼續(xù)執(zhí)行

    這篇文章主要介紹了python?如何實現(xiàn)跳過異常繼續(xù)執(zhí)行,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • python 定時器,輪詢定時器的實例

    python 定時器,輪詢定時器的實例

    今天小編就為大家分享一篇python 定時器,輪詢定時器的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-02-02
  • minpy使用GPU加速Numpy科學計算方式

    minpy使用GPU加速Numpy科學計算方式

    這篇文章主要介紹了minpy使用GPU加速Numpy科學計算方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 深入講解Python函數(shù)中參數(shù)的使用及默認參數(shù)的陷阱

    深入講解Python函數(shù)中參數(shù)的使用及默認參數(shù)的陷阱

    這篇文章主要介紹了Python函數(shù)中參數(shù)的使用及默認參數(shù)的陷阱,文中將函數(shù)的參數(shù)分為必選參數(shù)、默認參數(shù)、可變參數(shù)和關(guān)鍵字參數(shù)來講,要的朋友可以參考下
    2016-03-03
  • Python生成器以及應(yīng)用實例解析

    Python生成器以及應(yīng)用實例解析

    這篇文章主要介紹了Python生成器以及應(yīng)用實例解析,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-02-02
  • python剪切視頻與合并視頻的實現(xiàn)

    python剪切視頻與合并視頻的實現(xiàn)

    這篇文章主要介紹了python剪切視頻與合并視頻的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03
  • python使用PyGame模塊播放聲音的方法

    python使用PyGame模塊播放聲音的方法

    這篇文章主要介紹了python使用PyGame模塊播放聲音的方法,實例分析了PyGame模塊的使用技巧,需要的朋友可以參考下
    2015-05-05
  • Django城市信息查詢功能的實現(xiàn)步驟

    Django城市信息查詢功能的實現(xiàn)步驟

    Django中的查詢操作是數(shù)據(jù)庫操作中一個非常重要的技術(shù),下面這篇文章主要給大家介紹了關(guān)于Django城市信息查詢功能的實現(xiàn)步驟,文中通過實例代碼和圖文介紹的非常詳細,需要的朋友可以參考下
    2022-07-07
  • python getopt詳解及簡單實例

    python getopt詳解及簡單實例

    這篇文章主要介紹了 python getopt詳解及簡單實例的相關(guān)資料,需要的朋友可以參考下
    2016-12-12

最新評論

雷波县| 习水县| 韶关市| 丹阳市| 沅陵县| 秭归县| 吕梁市| 三河市| 芦溪县| 韶关市| 亳州市| 来宾市| 山阳县| 嘉鱼县| 汨罗市| 乡宁县| 淮阳县| 溆浦县| 公主岭市| 邓州市| 安平县| 天气| 财经| 重庆市| 平乐县| 光山县| 丰原市| 海晏县| 冕宁县| 永和县| 新龙县| 长汀县| 南充市| 山阳县| 手游| 台安县| 高雄市| 泌阳县| 得荣县| 塔城市| 房山区|