2011-08-31 222 views
1

在我的代碼:Python的分配錯誤的字典值

line_x = 10 
c = 'A' 
d = 'B' 
a = {} 
a['one']='| | | | | |' 
a['two']='| | | | | |' 
#untill thirteen 

vak = a.keys() 
b = a #copy the dictionary 
spot = a[vak[0]] 
spot2 = b[vak[0]] 
a[vak[0]] = spot[:(line_x)]+ d+ spot[(line_x+1):] 
b[vak[0]] = spot2[:(line_x)]+ c+ spot2[(line_x+1):] 

print a[vak[0]] #output_a = | | | A | | | 
print b[vak[0]] #output_b = | | | A | | | <- which should be a 'B' in the middle 

我有一些麻煩讓一本字典的副本,並更改​​值。

當我想更改其中一個字典中的值時,原始和副本的值都會更改。但我只想讓原稿更改並將副本更改爲其他內容。我似乎無法找到問題,儘管它的代碼非常小且相對簡單。

+2

我已編輯您的問題添加代碼。今後請在您的問題中粘貼代碼。它使人們更容易查看你的代碼並給你一個答案。如果你的代碼太長(這不是你的情況),那麼你可以考慮凝結你的代碼,並粘貼問題中與問題有關的顯着特徵。 – arunkumar

回答

5

b = a不復制的字典,它重新綁定b在同一對象a(所以當你改變a,你可以觀察b的影響以及)點。改爲使用b = copy.copy(a)copy模塊)。

+1

對於你是肌酸的淺拷貝,你也可以簡單地使用'b = dict(a)' – ThiefMaster

+0

@ThiefMaster:我發現'拷貝'更具描述性。 –

+1

@ThiefMaster'copy.copy'是一個淺拷貝; 'copy.deepcopy'存在用於深度複製。複製模塊更通用,它更明確地使用它來進行復制,而不是採用「複製構造函數」方法。 –

3

b = a #copy the dictionary 

不會複製字典,只是它的參考。你必須明確地將它複製:

b = copy(a) 

這將創建字典的副本,你可以用這兩種操作,它會工作。請記住,如果您將它們更改爲一個,則詞典中的可變對象會同時發生變化(如果它們仍存在於兩者中)。看看這個:

http://en.wikipedia.org/wiki/Object_copy#Deep_vs._Shallow_vs._Lazy_copy

+0

謝謝你們,這肯定會有幫助! – Joep