Даже встроенные типы ссылочные?

 
0
 
Python
ava
Gunslinger | 07.07.2010, 16:27
У него примеры со встроенными типами: int, str.
a=7
b=3
b=a
Пишет, что b теперь указывает на а. Не в b скопировалось значение а и в памяти теперь лежат две 7. В питоне все типы ссылочные?
Kommentare (6)
ava
Daevaorn | 07.07.2010, 15:37 #
В питоне всё объекты.
Цитата (Gunslinger @ 7.7.2010, 16:27 findReferencedText)
a=7

7 -- это объект типа int, а "а" это имя ссылки на него. Ну и "b" после присвоения тоже:

>>> a = 7
>>> id(a)
157140760
>>> b = a
>> id(a), id(b)
(157140760, 157140760)
ava
Gunslinger | 07.07.2010, 16:51 #
Daevaorn,
после с++ не привычно. А если нужно сделать копию данных встроенного типа из а и положить в b? Так же с помощью среза?
ava
unicross | 07.07.2010, 20:37 #
Цитата ("Gunslinger")
Пишет, что b теперь указывает на а. Не в b скопировалось значение а и в памяти теперь лежат две 7.

Неверно. b не указывает на а... a и b содержат ссылку на один и тот же объект 7. Объект 7 в памяти лишь один. В случае использования неизменяемых объектов (чисел, строк, кортежей) это не страшно.
>>> a = 7
>>> b = a
>>> a, b
(7, 7)
>>> b = 100
>>> a, b
(7, 100)

Как видно значение в a не изменилось.

Другое дело когда изменяемый тип (списки, словари и др.):
>>> a = [1, 2]
>>> b = a
>>> a, b
([1, 2], [1, 2])
>>> b[0] = 100
>>> a, b
([100, 2], [100, 2])

Теперь ситуация совсем иная. Значение изменилось и в a и в b...

В Python можно создать поверхностную копию и полную копию. Поверхностную копию можно создать с помощью операции извлечения среза, а полную копию - с помощью функции deepcopy() из модуля copy:
>>> import copy
>>> a = [1, 2]
>>> b = copy.deepcopy(a)
>>> a, b
([1, 2], [1, 2])
>>> b[0] = 100
>>> a, b
([1, 2], [100, 2])

ava
Gunslinger | 08.07.2010, 17:41 #
Цитата (unicross @ 7.7.2010, 20:37 findReferencedText)
b не указывает на а... a и b содержат ссылку на один и тот же объект 7

Я это и говорил, видимо не точно выразился.

später ergänzt:
Цитата (unicross @ 7.7.2010, 20:37 findReferencedText)


>>> a = 7

>>> b = a

>>> a, b

(7, 7)

>>> b = 100

>>> a, b

(7, 100)


b=a -- указывают на один участок памяти.
b=100 -- b выделяется новый участок памяти.
В чем тогда смысл a=b? Только в том, что с сылками работа быстрее, чем если бы пришлось выделять память?
ava
unicross | 08.07.2010, 20:29 #
Вот например в этом коде сколько объектов создается?
>>> a = 7
>>> b = 7

Думаете два объекта 7 ? Нет! Две переменные опять ссылаются на один объект 7:
>>> id(a), id(b)
(10016720, 10016720)
>>> a is b
True

В целях эффективности кода интерпретатор производит кэширование некоторых неизменяемых объектов. Это означает, что если ста переменным присвоено число 2, то в этих переменных будет сохранена ссылка на один и тот же объект.

Получить количество ссылок на объект можно с помощью функции getrefcount() из модуля sys:
>>> import sys
>>> sys.getrefcount(1)
1341

Как видно из примера на объект 1 ссылаются 1341 раз. При этом объект в памяти только один.

Изменяемые объекты кэшированию не подлежат:
>>> a = [7]
>>> b = [7]
>>> id(a), id(b)
(23184208, 23186248)
>>> a is b
False
>>> id(a[0]), id(b[0])
(10016720, 10016720)
>>> a[0] is b[0]
True

ava
Gunslinger | 09.07.2010, 10:29 #
Цитата (unicross @ 8.7.2010, 20:29 findReferencedText)
Вот например в этом коде сколько объектов создается?

.......

Думаете два объекта 7 ? Нет! Две переменные опять ссылаются на один объект 7:

За этот пример спасибо, у Саммерфилда пока не читал про такое. Что значит изменяемый\неизменяемый объект? Если после a=b мы присваиваем b новое значение, а значение а при этом не изменяется, то объект не изменяемый?
Registrieren Sie sich oder melden Sie sich an, um schreiben zu können.
Unternehmen des Tages
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Mitwirkende
advanced
Absenden