2012-03-09 215 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