![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Gunslinger |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
У него примеры со встроенными типами: int, str.
a=7 b=3 b=a Пишет, что b теперь указывает на а. Не в b скопировалось значение а и в памяти теперь лежат две 7. В питоне все типы ссылочные? |
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 9 Всего: 70 |
||||
|
||||
Gunslinger |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
Daevaorn,
после с++ не привычно. А если нужно сделать копию данных встроенного типа из а и положить в b? Так же с помощью среза? |
|||
|
||||
unicross |
|
||||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 422 Регистрация: 15.6.2008 Репутация: 1 Всего: 53 |
Неверно. b не указывает на а... a и b содержат ссылку на один и тот же объект 7. Объект 7 в памяти лишь один. В случае использования неизменяемых объектов (чисел, строк, кортежей) это не страшно.
Как видно значение в a не изменилось. Другое дело когда изменяемый тип (списки, словари и др.):
Теперь ситуация совсем иная. Значение изменилось и в a и в b... В Python можно создать поверхностную копию и полную копию. Поверхностную копию можно создать с помощью операции извлечения среза, а полную копию - с помощью функции deepcopy() из модуля copy:
|
||||||||
|
|||||||||
Gunslinger |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
Я это и говорил, видимо не точно выразился. Добавлено @ 17:44 b=a -- указывают на один участок памяти. b=100 -- b выделяется новый участок памяти. В чем тогда смысл a=b? Только в том, что с сылками работа быстрее, чем если бы пришлось выделять память? Это сообщение отредактировал(а) Gunslinger - 8.7.2010, 17:45 |
|||
|
||||
unicross |
|
||||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 422 Регистрация: 15.6.2008 Репутация: 1 Всего: 53 |
Вот например в этом коде сколько объектов создается?
Думаете два объекта 7 ? Нет! Две переменные опять ссылаются на один объект 7:
В целях эффективности кода интерпретатор производит кэширование некоторых неизменяемых объектов. Это означает, что если ста переменным присвоено число 2, то в этих переменных будет сохранена ссылка на один и тот же объект. Получить количество ссылок на объект можно с помощью функции getrefcount() из модуля sys:
Как видно из примера на объект 1 ссылаются 1341 раз. При этом объект в памяти только один. Изменяемые объекты кэшированию не подлежат:
|
||||||||
|
|||||||||
Gunslinger |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
За этот пример спасибо, у Саммерфилда пока не читал про такое. Что значит изменяемый\неизменяемый объект? Если после a=b мы присваиваем b новое значение, а значение а при этом не изменяется, то объект не изменяемый? Это сообщение отредактировал(а) Gunslinger - 9.7.2010, 10:30 |
|||
|
||||
![]() ![]() ![]() |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Python: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |