2013-03-22 76 views
1

(使用Python 2.7)如何創建未鏈接到原始對象的python對象的副本?

我想創建一個模板對象的複製品,以便稍後填充。爲了簡單起見,我試圖做這樣的:

template={'thing1':'','thing2':'','thing3':''} 
for number in some_list: 
    pile[number]=template 

但後來當我這樣做:

pile[1]['thing1']='blahblah' 

這也導致:

print pile[2]['thing1'] 
'blahblah' 
print template['thing1'] 
'blahblah' 

我想要的是

pile[1]['thing1']='blahblah' 

離開樁[2]獨自一人,使

print pile[2]['thing1'] 
'' 

我知道,問題是,當我說

pile[number]=template 

這意味着樁[1]爲模板,和樁[2]模板。 (這只是我在工作時才完全實現的...而且我大聲地重複了幾次,因爲它的實現和它的含義慢慢沉沒......這就是python 工作原理,呃?我覺得我剛剛加入python俱樂部,我從MATLAB開始,所以不要太粗糙。)

所以我想可能有兩種方法可以解決這個問題 - 一種涉及某種複製對象鏈接到原始的,或類似的東西,可能非常簡單明瞭。也許還有另外一種方法可以做到特定於字典,比如初始化密鑰或其他東西。我主要對第一種答案感興趣,因爲這有助於我理解python 的工作原理,但第二種答案也不錯。謝謝:)

回答

2

做出字典的淺表副本最簡單的方法就是用字典的copy方法:

In [1]: template = {'thing1': '', 'thing2': '', 'thing3': ''} 

In [2]: apile = template.copy() 

In [3]: apile['thing1'] = 1 

In [4]: apile 
Out[4]: {'thing1': 1, 'thing2': '', 'thing3': ''} 

In [5]: template 
Out[5]: {'thing1': '', 'thing2': '', 'thing3': ''} 

 

給列表的淺表副本,你可以採取整個列表的片段:

copied_list = original_list[:] 

 

如果您需要克隆其他的東西,或者如果你需要類型的字典詞典(或類型的字典列表,或其他可變對象)的深層副本,你應該使用copy模塊:http://docs.python.org/2/library/copy.html

copy.copy(x) 

返回x的淺表副本。

copy.deepcopy(x) 

返回X的深層副本。

淺層和深層的複製之間的差別是僅適用於化合物的對象(即包含其他對象的對象,如列表或類實例)有關:

  • 淺表副本構造新化合物對象,然後(在可能的範圍內)將引用插入到原始對象中。
  • 深層副本構造一個新的複合對象,然後遞歸地將副本插入原始對象中的副本。

 

關於你的第二個辦法:當然,你可以創建一個字典出另一個字典內,這將是一個副本:

In [23]: p = dict(template) 

In [24]: p['thing1'] = 1 

In [25]: template 
Out[25]: {'thing1': '', 'thing2': '', 'thing3': ''} 

In [26]: p 
Out[26]: {'thing1': 1, 'thing2': '', 'thing3': ''} 
+0

這是宏偉的。一個叫做「複製」的python方法,嗯,複製字典。謝謝你,先生。該文檔也有幫助。 – andy 2013-03-22 20:20:02

2

這是我最初的解決方案

import copy 

template = {1:''} 
d = {} 

for n in xrange(10): 
    d[n] = copy.deepcopy(template) 

但是我喜歡帕維爾的更好。

相關問題