Mail.ru Group corporate blog
Python
Programming
Debugging
ООP
Comments 26
0
в этом языке на самом деле не существуют указатели
x указывает на новый PyObject.
Если сравнивать со статический типизированными языками, где разделяется на передачу по ссылке и передачу по значению, в питоне всегда* передается «по ссылке» (указатель на объект).
+1
Какие примитивные? числа, строки? Перечитайте раздел который начинается с ">>> y = x"
+1
мне кажется, что если заголовки в первой табличке поменять с
«Тип/Неизменяемый?» на «Тип/Изменяемый?», ну и соответственно содержимое второй колонки инвертировать, то табличка станет более лучше читабельной.

Например сейчас лист он «не не изменяемый», а станет «изменяемый», что понятней, хотя и то же самое.
я так думаю.
0
Всё дело в интернированных (interned) объектах. Python предварительно создаёт в памяти определённое подмножество объектов и хранит их в глобальном пространстве имён для повседневного использования.

Строки размером меньше 20 символов и содержащие ASCII-буквы, цифры или знаки подчёркивания будут интернированы

Вот это явно неточно. Для того, чтобы создать все такие строки, не хватит никакой памяти.

0

Такие строки не создаются заранее.


Имеется ввиду, что если в программе была создана такая короткая строка, то она будет интернирована для будущего использования, а не будет удалена сборщиком мусора, если на нее никто не ссылается.

0
Имеются ввиду пустые PyObject с определенным типом. То есть эти объекты создаются заранее, что бы интерпретатор мог сразу присвоить значение, пропустив шаг создания объекта, тем самым слегка ускорив программу. Ну я понял это так, хотя на счет неточности согласен, я не до конца уверен.
+1
Здесь переменная x имеет фальшивый адрес 0x7f1 и значение 2337


Почему интересно фальшивый? В крайнем случае «виртуальный». У людей может создаться впечатление, что в С там тоже какае-то непонятная адресация.
0
«Освежить знания об указателях» для меня звучит как «освежить знания о таблице умножения»
0
в каких условиях было получено это
>>> x = 1000
>>> y = 1000
>>> x is y
True

На мой взгляд, это слегка противоречит этому
Какие объекты зависят от реализации Python? В CPython 3.7 интернированными являются:

Целые числа в диапазоне от -5 до 256.
+2
Проверил в 3.7, на самом деле False возвращает. Видимо, автор оригинальной статьи либо ошибся, либо чего-то недоговаривает.
0
в 3.5.2 тоже. Но остальные примеры работают.
Вообще, если в обучение программированию на Python приводит к таким пространным статьям на столь простую для обычного программиста тему, то на питоне нельзя обучать программированию. Гораздо проще запомнить концепцию переменной «коробка с названием и адресом» чем проскочив это понимание потом разбираться в тех хитросплетениях, которые пришлось ввести, чтобы скрыть этот факт.
Пока компьютеры имеют конечную память и фон-неймановскую архитектуру, понимать устройство и принцип исполнения программы всегда будет полезно, чтобы не натыкаться на странные случаи с малейшим изменением программы, которые приводят к катастрофическим изменения в производительности.
Наивное программирование годится для небольших не очень важных программок, или одноразовых случаев, но не для программ, предназначенных испольняться часто и нагруженых фукнционалом.
0
Вы подменяете условия, чтобы добиться желаемого результата.
Компилятор Cpython умеет в некоторые оптимизации, соответственно, «в виде скрипта» это будет соптимизировано(если интересны подробности — велком в исходный код Cpython). На скриншоте выше изображена интерактивная оболочка, и там работает интернирование(как минимум, в Cpython) — longobject.c#L49, на гите найдете.

Поэтому вопрос все еще открыт — как автор получил такой результат?
0
Кого волнует, может автор отсебятину написал.
Суть в том, что язык не регламентирует, что там должно получиться что-то однозначно определенное.
0
А можно для непосвящённых прояснить, для чего вообще нужна эмуляция указателей? При работе с подключаемыми библиотеками все понятно, но там даже не эмуляция, а реальные указатели, завёрнутые во вспомогательный объект. А вот именно эмуляция?) Пара примеров реального использования ответила бы на вопрос. Спасибо
0
допустим ты хочешь написать статью про указатели на питоне. вот для этой статьи ты делаешь иллюстрацию, придумываешь костыль на словарях и хитро называешь его примером эмуляции указателей. вот такой вот юзкейз.
0
Прогнал маленький тестик
Сначала добавляем, потом вычитаем.
0
10968768
1
10968800
2
10968832
3
10968864
4
10968896
5
10968928
4
10968896
3
10968864
2
10968832
1
10968800
0
10968768

очевидно, ссылки на константы

255
10976928
256
10976960
257
139679589358160
258
139679589357520
259
139679589358160
260
139679589357520
259
139679589358160
258
139679589357520
257
139679589358160
256
10976960
255
10976928

А вот тут уже интересней — константы кончились, результат попадает в новый объект
А при следующей операции — опять в старый…
(не, понятно что в пересозданный на том же месте)

И если константа занимает 32 байта, то объект все 640…
0
Всё это конечно круто, но мне сложно представить, где может быть реальная выгода от использования реальных указателей в python (т.е. из модуля ctypes которые). Если такая выгода есть, то не хватает примеров. А то так получается слишком много надо заморачиваться, чтобы увеличить x на единицу.
Only those users with full accounts are able to leave comments. , please.