字典方法更改
在 Python 3 中,許多字典方法在行為上與 Python 2 完全不同,許多字型方法也被刪除了:has_key
,iter*
和 view*
都消失了。而不是已經長期棄用的 d.has_key(key)
,現在必須使用 key in d
。
在 Python 2 中,字典方法 keys
,values
和 items
返回列表。在 Python 3 中,它們返回檢視物件; 檢視物件不是迭代器,它們有兩種不同之處,即:
- 它們有尺寸(可以使用
len
功能) - 它們可以多次迭代
此外,與迭代器一樣,字典中的更改也會反映在檢視物件中。
Python 2.7 已經從 Python 3 向後移植了這些方法; 它們可以作為 viewkeys
,viewvalues
和 viewitems
使用。要將 Python 2 程式碼轉換為 Python 3 程式碼,相應的表單是:
- Python 2 的
d.keys()
,d.values()
和d.items()
應改為list(d.keys())
,list(d.values())
和list(d.items())
d.iterkeys()
,d.itervalues()
和d.iteritems()
應該改為iter(d.keys())
,甚至更好,iter(d)
; 分別是iter(d.values())
和iter(d.items())
- 最後 Python 2.7 方法呼叫
d.viewkeys()
,d.viewvalues()
和d.viewitems()
可以替換為d.keys()
,d.values()
和d.items()
。
移植 Python 2 程式碼,迭代字典鍵,值或專案,同時改變它有時是棘手的。考慮:
d = {'a': 0, 'b': 1, 'c': 2, '!': 3}
for key in d.keys():
if key.isalpha():
del d[key]
程式碼看起來好像它在 Python 3 中的工作方式類似,但是 keys
方法返回一個檢視物件,而不是列表,如果字典在迭代時改變大小,Python 3 程式碼將與 RuntimeError: dictionary changed size during iteration
一起崩潰。解決方案當然是正確編寫 for key in list(d)
。
類似地,檢視物件的行為與迭代器的行為不同:一個不能在它們上使用 next()
,一個不能恢復迭代; 它會重新啟動; 如果 Python 2 程式碼將 d.iterkeys()
,d.itervalues()
或 d.iteritems()
的返回值傳遞給期望迭代器而不是迭代的方法,則 Python 3 中應該是 iter(d)
,iter(d.values())
或 iter(d.items())
。