LINUX.ORG.RU

Pyhon, создание объекта

 ,


0

1

Всем привет. Возник такой вопрос, касающийся создания объектов в Python.

Вопрос состоит в том — возвращается ли кроме *самого* объекта еще и ссылка на него?

Поясню на примере, что имею ввиду.

my_list = ['a', 'b', 'c']

my_list.sort()

Здесь мы создали объект-список, сохранили *ссылку* на него в my_list. Теперь мы можем обращаться к списку через my_list.

Но мы могли бы обойтись и без my_list

['a', 'b', 'c'].sort()

Т.е, как я понимаю, в этом случае у нас просто создастся в куче список, используется, и т.к. на него нету ссылок — будет удален GC?

Где-бы поподробнее почитать про это?

Где-бы поподробнее почитать про это?

В документации.

anonymous ()

Вопрос состоит в том — возвращается ли кроме *самого* объекта еще и ссылка на него?

«Сам объект» не возвращается.

Где-бы поподробнее почитать про это?

Python Reference Manual, глава 3: Data model.

tailgunner ★★★★★ ()
Ответ на: комментарий от tailgunner

tailgunner

Ок, спасибо. Т.е., как я понял, когда мы создали список — мы просто выделили (ну не мы, а python VM) место в куче для него. Если на него не будет ссылок, то рано или поздно gc просто «приберется» за собой. Верно?

GreenBag ★★ ()
Ответ на: комментарий от GreenBag

мы просто выделили (ну не мы, а python VM) место в куче для него

В твоем примере создается объект, но ссылка на него существует только во время вычисления выражения (исполнения метода sort).

Если на него не будет ссылок, то рано или поздно gc просто «приберется» за собой. Верно?

Да.

tailgunner ★★★★★ ()
Ответ на: комментарий от tailgunner

А если быть точнее — где эта ссылка в этот момент «сидит» и когда прибивается? Или это уже реализацию cpython нужно ковырять?

GreenBag ★★ ()
Ответ на: комментарий от tailgunner

Т.е. в *любом* случае у нас в стеке появляется ссылка на объект. А при присваивании ее к переменной, мы просто копируем ее в переменную?

GreenBag ★★ ()
Ответ на: комментарий от GreenBag

Вот интересно, на что тебе знание внутренностей конкретной реализации питона? Как часто это оказывается полезным?

anonymous ()
my_list = ['c', 'b', 'a']
result = sorted(my_list)
print(result)
print(my_list)
result = my_list.sort()
print(result)
print(my_list)

В общем, есть функции которые меняют значение in-place, а есть которые работают над копией.

true_admin ★★★★★ ()
Ответ на: комментарий от true_admin

есть функции которые меняют значение in-place, а есть которые работают над копией.

Причём те, что меняют значение самого объекта, возвращают None. Так сделано специально, чтобы не возникало недоразумений. По крайней мере, так в доках написано.

i-rinat ★★★★★ ()
Ответ на: комментарий от i-rinat

угу, я поэтому и привёл скрипт :). my_list.sort() напишет None.

true_admin ★★★★★ ()
Ответ на: комментарий от GreenBag

Я, кстати, полагаю, что в данном конкретном случае реализация не будет отличаться, скажем, между cpython и jpython.

Не верно, cpython использует reference counting, освобождая объекты немедленно, в отличие от жабы.

Boba_Fett ()

Pyhon

Такого варианта я еще не видел, спасибо.

pevzi ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.