Python的字典和列表的使用中一些需要注意的地方
Python 中有三個非常好用的數據結構,列表,元組和字典, 元組是不可變的,列表可以保存任意類型的Python對象,并可以隨意擴展沒有大小限制, 字典是一個key-value的鍵值映射的類型,可以存放任何Python對象,可以嵌套字典, 值可以是字典元組或者字典
這里說是Python 字典和列表的陷阱不如說是Python的一些特性,如果不了解這些特性 就會引發(fā)一些難以尋找的bug
下面我們來介紹這些特性
Python中所有對列表和字典的使用僅僅是對原來對象的引用而不是創(chuàng)建一個新的對象 如下面代碼:
>>> info = dict(name='cold', blog='www.linuxzen.com') # 創(chuàng)建字典{'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']
大家看到如果將列表或者字典重新賦值給另外一個變量并沒有達到預想的效果, 我們更改一個的同時另外一個也在同時更改,如果我們想保留一個快照,很明顯我們 沒有達到我們想要的效果,另外還有一種常見的使用,因為我們知道普通變量傳遞給 函數,函數在內部更改是不會影響到外部變量的,那么列表和字典呢? 我們來看如下代碼,我們創(chuàng)建一個函數,是字典就添加一個鍵和值,是列表就在尾部添加一個元素
>>> 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']
如上代碼明顯不是我們想要的結果,如果這個列表/字典僅僅用在一個地方可能不會發(fā)生什么 如果我們其他地方需要同樣的列表進行處理,如果你不知道這個特性就會產生很難尋找的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'}
上面代碼列表使用[:]可以創(chuàng)建一個列表的副本而不是引用 字典的copy方法同樣可以創(chuàng)建一個字典的副本而不是引用 這樣就可以避免之前所說的引用的情況
相關文章
Python實現SSH遠程登陸,并執(zhí)行命令的方法(分享)
下面小編就為大家?guī)硪黄狿ython實現SSH遠程登陸,并執(zhí)行命令的方法(分享)。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05Python模型聚合查詢\Q查詢\F查詢\分組查詢操作技巧解析
這篇文章主要介紹了模型查詢中的一些操作技巧,主要包括模型聚合查詢,Q查詢,F查詢,分組查詢,有需要的朋友可以借鑒參考下,希望可以有所幫助2021-09-09