字典方法更改

在 Python 3 中,許多字典方法在行為上與 Python 2 完全不同,許多字型方法也被刪除了:has_keyiter*view*都消失了。而不是已經長期棄用的 d.has_key(key),現在必須使用 key in d

在 Python 2 中,字典方法 keysvaluesitems 返回列表。在 Python 3 中,它們返回檢視物件; 檢視物件不是迭代器,它們有兩種不同之處,即:

  • 它們有尺寸(可以使用 len 功能)
  • 它們可以多次迭代

此外,與迭代器一樣,字典中的更改也會反映在檢視物件中。

Python 2.7 已經從 Python 3 向後移植了這些方法; 它們可以作為 viewkeysviewvaluesviewitems 使用。要將 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())