Python的字典和列表的使用中一些需要注意的地方

來源:互聯網
上載者:User
Python 中有三個非常好用的資料結構,列表,元組和字典, 元組是不可變的,列表可以儲存任意類型的Python對象,並可以隨意擴充沒有大小限制, 字典是一個key-value的索引值映射的類型,可以存放任何Python對象,可以嵌套字典, 值可以是字典元組或者字典

這裡說是Python 字典和列表的陷阱不如說是Python的一些特性,如果不瞭解這些特性 就會引發一些難以尋找的bug

下面我們來介紹這些特性

Python中所有對列表和字典的使用僅僅是對原來對象的引用而不是建立一個新的對象 如下面代碼:

>>> info = dict(name='cold', blog='www.linuxzen.com') # 建立字典{'name':'cold', 'blog':'www.linuxzen.com'}>>> info2 = info   # 賦值給info2>>> info2['name'] = 'cold night'>>> info>>> info2{'blog': 'www.linuxzen.com', 'name': 'cold night'}>>> info{'blog': 'www.linuxzen.com', 'name': 'cold night'}>>> names = ['cold', 'night', 'linuxzen']>>> names2 = names>>> names2.append('cold night')>>> names['cold', 'night', 'linuxzen', 'cold night']>>> names2['cold', 'night', 'linuxzen', 'cold night']

大家看到如果將列表或者字典重新賦值給另外一個變數並沒有達到預想的效果, 我們更改一個的同時另外一個也在同時更改,如果我們想保留一個快照,很明顯我們 沒有達到我們想要的效果,另外還有一種常見的使用,因為我們知道普通變數傳遞給 函數,函數在內部更改是不會影響到外部變數的,那麼列表和字典呢? 我們來看如下代碼,我們建立一個函數,是字典就添加一個鍵和值,是列表就在尾部添加一個元素

>>> def add_something(info):...   if type(info) == dict:...       info['msg'] = 'Hello,'+ info['name']...   elif type(info) == list:...       info.append('add to the list')... >>> info = {'name':'cold', 'blog':'www.linuxzen.com'}>>> add_something(info)>>> info{'blog': 'www.linuxzen.com', 'msg': 'Hello,cold', 'name': 'cold'}>>> names = ['cold', 'night', 'linuxzen.com']>>> add_something(names)>>> names['cold', 'night', 'linuxzen.com', 'add to the list']

如上代碼明顯不是我們想要的結果,如果這個列表/字典僅僅用在一個地方可能不會發生什麼 如果我們其他地方需要同樣的列表進行處理,如果你不知道這個特性就會產生很難尋找的bug 當上面並不是我們想要的我們該如何避免上面呢,我們可以對列表/字典做一個拷貝,而不是 簡單的引用

>>> names = ['cold', 'night', 'linuxzen.com']>>> names2 = names[:]>>> names2.append('cold night')>>> names['cold', 'night', 'linuxzen.com']>>> names2['cold', 'night', 'linuxzen.com', 'cold night']>>> info = {'name':'cold night', 'blog':'www.linuxzen.com'}>>> info2 = info.copy()>>> info2['name'] = 'cold'>>> info{'blog': 'www.linuxzen.com', 'name': 'cold night'}>>> info2{'blog': 'www.linuxzen.com', 'name': 'cold'}

上面代碼清單使用[:]可以建立一個列表的副本而不是引用 字典的copy方法同樣可以建立一個字典的副本而不是引用 這樣就可以避免之前所說的引用的情況

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.