字典方法更改
在 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())。