2016-10-14 2 views
0

Делая все, что в оболочке Microsoft и с помощью 2.7.12Variable процесс создания в Python

Prelude

a = [1,2,3,4,5] 
b = [1,2,3,4,5] 
c = a 

действие

a[0] is b[0] is c[0] 
True 

ли не три списка, указывающего на одни и те же элементы в память? и поэтому они могут измениться, если их изменить?

Часть Я понимаю:

c[0] = 8888888 
a[0] 
8888888 

Часть я не понимаю:

b[0] = 9999999 
a[0] 
1 
+0

Почему ' a' и 'b' указывают на одно и то же место? просто потому, что у них есть списки с одинаковыми значениями? – UnholySheep

+0

Вот как это происходит на питоне. Таким образом, вы создаете a = 5 и itll search, если 5 уже существует, и если это будет указывать на это. забавное упражнение для вас: a = [1,2,3,4,5]; g = 4; g - [3]; Правда. смешно, правильно ?? !! может кто-то подтвердить, правильно ли я сказал? PS - Новое для сообщества –

+0

Целые числа неизменяемы, список изменен. Представленные ответы объясняют это очень подробно. «То, как это происходит в python» также явно ошибочно, иначе вы не увидите результат, который видите. – UnholySheep

ответ

3

Python может принять решение разделить неизменные объекты хранения (строки, целые числа, ...)

Поскольку они неизменяемы, они прозрачны для пользователя. Это просто экономит память.

a[0] is b[0] 

может быть правдой или ложью. С другой стороны

a[0] is c[0] 

всегда правда, потому что a is c. (И модификации a изменений c)

Но поскольку list типа изменчив, a не может быть b (Python не позволяет себе оптимизировать хранение в этом случае). Это независимые объекты. Изменение a не может изменить b.

примечание о моем «может быть истинным или ложным» замечанием. Рассмотрим это в питона 3.4

>>> b=1234567890 
>>> a=[1234567890] 
>>> b is a[0] 
False 

Python не удосужились сделать связь между b и a[0]. Также случается с длинными строками (я предполагаю, что это была бы проблема производительности с низкой вероятностью, чтобы найти точное большое число 2 раза подряд, тогда как 1 имеет больше шансов быть повторенным во всей программе)

Однако, если вы сделаете это вы получите другой результат:

>>> b=1234567890 
>>> a=[b,1,2] 
>>> b is a[0] 
True 

(я бы не сказал точно, почему, как он может изменяться в зависимости, будет ли она хранится в виде длинной ИНТ или просто INT, значение или адрес, и т.д ..., но Python определенно больше информации о дублирующейся стоимости здесь!)

Вывод: не полагайтесь на это для immuta объектов. Используйте == в любое время.

+0

Вы говорите: -a = [1,2,3,4] –

+0

вы говорите a = [1,2,3,4] b = 1 a [0] is b может быть ложным –

+0

определенно, возможно, не для значения '1', но все же: см. Мое редактирование. –

0

int s is неизменный. Это означает, что когда вы переназначаете a[0], вы не меняете то, что 1 есть. Скорее всего, вы меняете все, что есть a[0]. Вы не меняете то, что значит быть 1 - вы меняете то, что значит быть a[0].

Если с другой стороны, вы сделали это:

L = [1,2,3] 
a = [L] 
b = [L] 
a.[0].append(4) 

вы увидите изменение отражается в b а

0

Назначение в Python является ссылкой - он создает новую ссылку или псевдоним для объекта, а не для копирования объекта - и поскольку событие int - это объект в Python - по крайней мере (в моей версии - до 256), это правило в основном работает.

В следующем примере функции остроумие ID - который показывает ссылку на объект - иллюстрирует точку

In [37]: a = range(1, 6) 

In [38]: b = range(1, 6) 

In [39]: id(1) 
Out[39]: 4298160472 

In [40]: id(a[0]) 
Out[40]: 4298160472 

In [41]: id(a) 
Out[41]: 4376534696 

In [42]: id(b) 
Out[42]: 4378531744 

In [44]: c = a 

In [45]: id(c) 
Out[45]: 4376534696 

Тем не менее, это не будет работать на поплавках - что логично, поскольку количество поплавков, а целые числа бесконечно

In [49]: a = .1 

In [50]: b = .1 

In [51]: id(a) 
Out[51]: 4298708040 

In [52]: id(b) 
Out[52]: 4303248152 

Как вы можете видеть, новый объект создается для каждого нового поплавка, хотя значение такое же