2013-07-31 3 views
0

Sayпеременная реферирование и назначение

c = 10 
a = b = c 

a,b и теперь ссылка c, поэтому я подумал, что если c изменения, так будет a,b, как

c = 123 # change c, then a = b = 123 

Но на самом деле, a,b не меняется на всех , Зачем? Теперь рассмотрим список

m = [0] 
l = [m]*3 
l[0][0] = 1 # just change l[0][0], then l[1:] change 

Почему?

ответ

6

a и b сделать не ссылка c, все три из них ссылаться на объект 10.

Это означает, что выполнение c = 123 не изменит объект заc, он будет просто указать c на новом объекте 123, оставляя a и b в одиночку.

Другими словами, у вас есть изначально:

a ---+ 
    | 
b ---+---> 10-object 
    | 
c ---+ 

и исполняющие c = 123 изменения, чтобы:

a ---+ 
    | 
b ---+---> 10-object 

c -------> 123-object 

Чем раньше вы поймете, что Python действительно является полностью объектно-ориентированным, тем быстрее вы 'lk grok язык :-)

Причина, по которой ваш второй образец изменяет все элементы в l потому, что все элементы в l списке ссылки на единый list1, а не отдельные объекты аккомпанемента:

l -------> list2 {list1, list1, list1} 
m -------> list1 {0-object} 

Выполнение l[0][0] = 1 идентично выполнения m[0] = 1 (см ниже), который не изменит связывания из m в свой список, или связывание этих элементов в list2 к list1, а просто изменить пункт вlist2 быть 1-object:

l -------> list2 {list1, list1, list1} 
m -------> list1 {1-object} 

Следовательно, вы можете видеть, что изменение содержания list1 влияет на все.Транскрипт показывает, что l[0][0] и m[0] эквивалентны показано ниже:

>>> m = [0] 
>>> l = [m] * 3 
>>> m 
[0] 

>>> l 
[[0], [0], [0]] 

>>> l[0][0] = 1 
>>> l 
[[1], [1], [1]] 

>>> m 
[1] 

>>> m[0] = 42 
>>> l 
[[42], [42], [42]] 

Обратите внимание, что если вы измените связывания из m, что не изменит фактические привязок в list2:

>>> m = [999] 
>>> l 
[[42], [42], [42]] 

Когда вы это сделаете, вы получите:

l -------> list2 {list1, list1, list1} 
      list1 {42-object} 
m -------> list3 {999-object} 
+0

Ваш ответ настолько хорош ... I только пожелайте, чтобы заголовок вопроса был более описательным, чтобы больше людей с большей вероятностью находило этот ответ. – SethMMorton

+0

Большое вам спасибо. – Alcott

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