簡體   English   中英

Python字典初始化?

[英]Python dictionary initialization?

我不確定這是一個錯誤還是一個功能。 我有一個用空列表初始化的字典。

讓我們說

keys =['one','two','three']
sets = dict.fromkeys(keys,[])

我觀察到的是,如果您將任何項目附加到任何列表中,則會修改所有列表。

sets = dict.fromkeys(['one','two','three'],[])
sets['one'].append(1)

{'three': [1],'two': [1], 'one': [1]}

但是當我手動使用循環時,

for key in keys:
      sets[key] = []
sets['one'].append(1)

{'three': [], 'two': [], 'one': [1]}

我認為第二種行為應該是默認行為。

這就是Python中的工作方式。

以這種方式使用fromkeys()時,最后fromkeys()三個對同一列表的引用。 當您更改一個列表時,所有三個列表都會發生變化。

在這里也可以看到相同的行為:

In [2]: l = [[]] * 3

In [3]: l
Out[3]: [[], [], []]

In [4]: l[0].append('one')

In [5]: l
Out[5]: [['one'], ['one'], ['one']]

同樣,這三個列表實際上是對同一列表的三個引用:

In [6]: map(id, l)
Out[6]: [18459824, 18459824, 18459824]

(注意他們如何擁有相同的id)

其他答案涵蓋了“為什么”,所以這里是如何。

您應該使用理解來創建所需的字典:

>>> keys = ['one','two','three']
>>> sets = { x: [] for x in keys }
>>> sets['one'].append(1)
>>> sets
{'three': [], 'two': [], 'one': [1]}

對於Python 2.6及更低版本,字典理解可以替換為:

>>> sets = dict( ((x,[]) for x in keys) )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM