2012-03-09 2 views
1

мне было интересно, если кто-то может объяснить мне:в питона присвоить значение на основе словаря отображения

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, но его не. Кто-нибудь может объяснить, почему?

Благодаря

+0

попробуйте это для изменения ... a = 1; b = a; a = 4; print b ... приведет к 1 ... Поэтому, когда вы назначаете poz [0] = poz0, вы помещаете внутри poz [0] значение не в экземпляр. В этом «for» вы меняете начальное значение на другое; – StefanNch

ответ

4

Вы переназначить poz[0] на другой объект, а именно значения 'some value '+str(0). Оператор присваивания = не изменяет значение poz[0], но меняет привязку в dict.

+0

имеет смысл, получил его сейчас! спасибо за ясный ответ – marlboro

+0

Я считаю, что ответ Диего правильный ... poz [0] не содержит ссылок на объект poz0 ... poz0 = 100; POZ = {0: poz0}; print poz; poz0 = 1000; print poz; ... без изменений – StefanNch

+0

@StefanNch: Ваши аргументы ошибочны. 'poz [0]' содержит ссылку на значение 'poz0' после' poz [0] = poz0', но в вашем примере вы переназначаете 'poz0'. –

2

значения различны, потому что str экземпляров встроены в неизменных объектах (числа, строки, кортежи, frozensets). Поэтому, когда вы создаете словарь в poz={0:poz0, 1:poz1}, вы фактически делаете то же самое, что и poz={0:'', 1:''}.

poz0 не имеет отношения к poz[0], есть разные объекты.

Update ответив комментарий:

Со списком не то же самое поведение, так как списки изменяемые объекты:

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] '. –

+0

Не то же самое с изменяемыми объектами (см. Обновленный ответ) –

+1

Хорошо, я, наконец, поймал тебя. Это потому, что назначение. –

Смежные вопросы