2015-06-07 77 views
2

所以我的問題是如何通過鍵而不是獲得一個指針VALUE。我有下面的代碼,並且我想在不更改字典中的值的情況下執行tempA。python字典得到值

temp_keys=["a","b","c","d"] 
temp_values=[[1,1],[2,2],[3,3],[4,4]] 
temp=dict(zip(temp_keys,temp_values)) 

tempA=temp.get('a',temp.copy()) 
tempA.append(2) 
print temp 

輸出爲:

{'a': [1, 1, 2], 'b': [2, 2], 'c': [3, 3], 'd': [4, 4]} 

見鍵的值 「a」 已經改變。
我希望我的變量temp不變,

{'a': [1, 1], 'b': [2, 2], 'c': [3, 3], 'd': [4, 4]} 
+1

你能加上預計產量也?只是爲了完整性 –

+0

完成編輯,你能幫忙嗎? – NewbieDave

+0

爲什麼不做任何事情?您的預期輸出將與您知道複製的前3條線 – michaelpri

回答

2

如果我理解正確的話,你要複製的字典值,在這種情況下,列表,並將附加元素添加到副本中。

您可以使用new_list = list(old_list)new_list = old_list[:]複製python中的列表。

# Our dictionary: 
my_dict = {'a': [1, 1], 'b': [2, 2], 'c': [3, 3], 'd': [4, 4]} 

# Copy element a: 
new_a = list(my_dict['a']) 
new_a.append(2) 

print my_dict # {'a': [1, 1], 'b': [2, 2], 'c': [3, 3], 'd': [4, 4]} 
print new_a # [1, 1, 2] 
+1

非常感謝你 – NewbieDave

2

我相信你正在尋找深拷貝

import copy 
temp_keys=["a","b","c","d"] 
temp_values=[[1,1],[2,2],[3,3],[4,4]] 
temp=dict(zip(temp_keys,temp_values)) 
print temp 
temp_copy = copy.deepcopy(temp) 
temp_copy['a'].append(2) 
print temp 

temp將保持不變:

{ 'd':4 ,'b':[2,2],'c':[3,3],'a':[1,1]} {'d':[4,4], 'b': [2,2],'c':[3,3],'a':[1,1]}

+1

'deepcopy'在這裏不是必需的,因爲列表不嵌套 –

2

這裏的問題是你的值是一個列表這是一個可變的結構。爲此,您需要copy

>>> temp_keys=["a","b","c","d"] 
>>> temp_values=[[1,1],[2,2],[3,3],[4,4]] 
>>> temp=dict(zip(temp_keys,temp_values)) 

到目前爲止這麼好。現在副本返回的值,而不是傳遞的參數

>>> tempA=copy.copy(temp.get('a',temp)) 

現在輸出將如預期

>>> tempA.append(2) 
>>> print temp 
{'a': [1, 1], 'c': [3, 3], 'b': [2, 2], 'd': [4, 4]} 
+0

非常感謝! – NewbieDave

+0

不客氣。所有最好的 –

1

只是改變

tempA=temp.get('a',temp.copy()) 

tempA=temp.get('a').copy() 

解釋 如果您打印的兩個字典的鍵 'A'(原件和複製)的ID,你會發現他們指的是內存中的相同位置。因此,一個變化會影響另一個。

newtemp = dict(temp) 
print(id(newtemp.get('a'))) 
print(id(temp.get('a'))) 

輸出

39274840 
39274840 
+0

是這裏最好的答案+1給你 –