2015-08-09 91 views
7

是可能的「填充」 Python中的數組,像這樣:在Python使唯一對象列表

> [0] * 10 
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 

我想用這個樣本的原則,以快速建立類似的對象列表:

> a = [{'key': 'value'}] * 3 
> a 
[{'key': 'value'}, {'key': 'value'}, {'key': 'value'}] 

但現在看來,這些對象是環環相扣:

> a[0]['key'] = 'another value' 
> a 
[{'key': 'another value'}, {'key': 'another value'}, {'key': 'another value'}] 

由於Python沒有一個clone()方法(這是我尋找的第一件事),我將如何創建獨特的對象,而無需聲明for循環並呼籲append()添加它們?

謝謝!

+2

FWIW,在''copy.copy()''函數可用於 「克隆」 多種現有Python對象。另外,一些可變對象(deques,set,dicts)有一個''copy()''方法。該列表對象在Python 3中增加了一個'copy()''方法。 –

+0

由於問題已關閉,因此我必須使用註釋來回答問題的有趣部分,「如何在沒有for - 循環和追加?「這是你可以做的:''d = {'key':'value'};導入副本;從itertools導入重複; a = list(map(copy.copy,repeat(d,10)))''。當有''copy()''方法可用時,使用* starmap *會更快:''a = list(starmap(d.copy,repeat((),10)))''。 –

回答

3

一個簡單的列表理解應該做的伎倆:

>>> a = [{'key': 'value'} for _ in range(3)] 
>>> a 
[{'key': 'value'}, {'key': 'value'}, {'key': 'value'}] 
>>> a[0]['key'] = 'poop' 
>>> a 
[{'key': 'poop'}, {'key': 'value'}, {'key': 'value'}]