2012-03-09 239 views
1

我想知道,如果有人可以給我講解一下值:在python分配基於字典映射

In [400]: poz0='' 

In [401]: poz1='' 

In [402]: poz={0:poz0, 1:poz1} 

In [403]: for i in range(1): 
    .....:  poz[i]='some value '+str(i) 
    .....: 

In [404]: 

In [405]: poz[0] 
Out[405]: 'some value 0' 

In [406]: poz0 
Out[406]: '' 

我期待爲poz0被== POZ [0],同爲poz1,但其不。任何人都能解釋爲什麼因爲str實例是內置不可變對象(數字,字符串,元組,frozensets)

感謝

+0

試試這個改變... a = 1; b = a; a = 4;打印b ...將導致1 ...因此,當您分配poz [0] = poz0時,您將poz [0]放入值不是實例。在那個「for」中,你改變了另一個的初始值; – StefanNch 2012-03-09 12:29:19

回答

4

您重新分配poz[0]到不同的對象,而'some value '+str(0)即值。賦值運算符=未修改poz[0]的值,但更改了dict中的綁定。

+0

是有道理的,現在明白了!謝謝你的明確答案 – marlboro 2012-03-09 12:37:06

+0

我相信Diego的答案是正確的... poz [0]不包含對poz0對象的任何引用... poz0 = 100; POZ = {0:poz0};打印poz; poz0 = 1000;打印poz; ...沒有變化 – StefanNch 2012-03-09 12:40:02

+0

@StefanNch:你的推理是有缺陷的。 'poz [0]'確實包含'poz [0] = poz0'後的'poz0'的值,但在你的例子中,你自己重新賦值'poz0'。 – 2012-03-09 13:02:51

2

的值是不同的。因此,當您在poz={0:poz0, 1:poz1}中創建字典時,您的實際操作與poz={0:'', 1:''}相同。

poz0沒有以任何方式與poz[0]鏈接,有不同的對象。

更新接聽評論:

與列表是不一樣的行爲,因爲列表是可變對象:

In [9]: l = [1,2,3] 

In [10]: d = {0: l} 
In [12]: d[0] 

Out[12]: [1, 2, 3] 

In [13]: d[0].append(4) 

In [14]: d[0] 
Out[14]: [1, 2, 3, 4] 

In [15]: l 
Out[15]: [1, 2, 3, 4] 
+2

雖然屬實,但這不是行爲的原因。使用列表可以顯示類似的行爲:'d = {0:[1]}; d [0] = [2]'。 – 2012-03-09 12:28:07

+0

與可變對象不一樣(查看更新後的答案) – 2012-03-09 12:34:44

+1

好吧,我終於抓住你了。這是因爲任務。 – 2012-03-09 12:36:41