Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Даже встроенные типы ссылочные? у Саммерфильда как-то расплывчато 
:(
    Опции темы
Gunslinger
Дата 7.7.2010, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: 1
Всего: 3



У него примеры со встроенными типами: int, str. 
a=7
b=3
b=a
Пишет, что b теперь указывает на а. Не в b скопировалось значение а и в памяти теперь лежат две 7. В питоне все типы ссылочные? 

PM MAIL   Вверх
Daevaorn
Дата 7.7.2010, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 9
Всего: 70



В питоне всё объекты.
Цитата(Gunslinger @  7.7.2010,  16:27 Найти цитируемый пост)
a=7

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

>>> a = 7
>>> id(a)
157140760
>>> b = a
>> id(a), id(b)
(157140760, 157140760)

PM MAIL WWW   Вверх
Gunslinger
Дата 7.7.2010, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: 1
Всего: 3



Daevaorn
после с++ не привычно. А если нужно сделать копию данных встроенного типа из а и положить в b? Так же с помощью среза?
PM MAIL   Вверх
unicross
Дата 7.7.2010, 20:37 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 422
Регистрация: 15.6.2008

Репутация: 1
Всего: 53



Цитата("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])


PM MAIL WWW   Вверх
Gunslinger
Дата 8.7.2010, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: 1
Всего: 3



Цитата(unicross @  7.7.2010,  20:37 Найти цитируемый пост)
b не указывает на а... a и b содержат ссылку на один и тот же объект 7

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

Добавлено @ 17:44
Цитата(unicross @  7.7.2010,  20:37 Найти цитируемый пост)
Код

>>> a = 7
>>> b = a 
>>> a, b
(7, 7)
>>> b = 100
>>> a, b
(7, 100)

b=a -- указывают на один участок памяти.
b=100 -- b выделяется новый участок памяти.
В чем тогда смысл a=b? Только в том, что с сылками работа быстрее, чем если бы пришлось выделять память?

Это сообщение отредактировал(а) Gunslinger - 8.7.2010, 17:45
PM MAIL   Вверх
unicross
Дата 8.7.2010, 20:29 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 422
Регистрация: 15.6.2008

Репутация: 1
Всего: 53



Вот например в этом коде сколько объектов создается?
Код
>>> 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


PM MAIL WWW   Вверх
Gunslinger
Дата 9.7.2010, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: 1
Всего: 3



Цитата(unicross @  8.7.2010,  20:29 Найти цитируемый пост)
Вот например в этом коде сколько объектов создается?
.......
Думаете два объекта 7 ? Нет! Две переменные опять ссылаются на один объект 7:

За этот пример спасибо, у Саммерфилда пока не читал про такое. Что значит изменяемый\неизменяемый объект? Если после a=b мы присваиваем b новое значение, а значение а при этом не изменяется, то объект не изменяемый?


Это сообщение отредактировал(а) Gunslinger - 9.7.2010, 10:30
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0906 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.