Как стать автором
Обновить

Комментарии 28

Спасибо за статью!
Спасибо за перевод. Реально интересный материал.
Прекрасный материал. Прочитал с большим интересом!
Вы забыли про bytesarray указать в списке изменяемых.
в этом языке на самом деле не существуют указатели
x указывает на новый PyObject.
Если сравнивать со статический типизированными языками, где разделяется на передачу по ссылке и передачу по значению, в питоне всегда* передается «по ссылке» (указатель на объект).
не всегда. примитивные значения копируются
Какие примитивные? числа, строки? Перечитайте раздел который начинается с ">>> y = x"
НЛО прилетело и опубликовало эту надпись здесь
Всё дело в интернированных (interned) объектах. Python предварительно создаёт в памяти определённое подмножество объектов и хранит их в глобальном пространстве имён для повседневного использования.

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

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

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


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

НЛО прилетело и опубликовало эту надпись здесь
Здесь переменная x имеет фальшивый адрес 0x7f1 и значение 2337


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

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

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

Поэтому вопрос все еще открыт — как автор получил такой результат?
Кого волнует, может автор отсебятину написал.
Суть в том, что язык не регламентирует, что там должно получиться что-то однозначно определенное.
Не противоречит.

Мб это опечатка? Были не 1000, а 100?

Правда, во время копирования добавить по лишнему нулю к двум строкам... Звучит как что-то невероятное

А можно для непосвящённых прояснить, для чего вообще нужна эмуляция указателей? При работе с подключаемыми библиотеками все понятно, но там даже не эмуляция, а реальные указатели, завёрнутые во вспомогательный объект. А вот именно эмуляция?) Пара примеров реального использования ответила бы на вопрос. Спасибо
допустим ты хочешь написать статью про указатели на питоне. вот для этой статьи ты делаешь иллюстрацию, придумываешь костыль на словарях и хитро называешь его примером эмуляции указателей. вот такой вот юзкейз.
Прогнал маленький тестик
Сначала добавляем, потом вычитаем.
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…
спасибо большое. отличная статья.
Всё это конечно круто, но мне сложно представить, где может быть реальная выгода от использования реальных указателей в python (т.е. из модуля ctypes которые). Если такая выгода есть, то не хватает примеров. А то так получается слишком много надо заморачиваться, чтобы увеличить x на единицу.

С помощью указателей можно пойти немного не по "Pythonic way" и связать между собой значения аргументов разных объектов. Чтобы, изменения одного объекта сразу влияли на другой

P.S. У меня есть идея как в своём проекте это можно использовать, но не уверен, что смогу нормально это описать.
Единственное, что точно могу сказать - это связано с настольными РПГ

Зарегистрируйтесь на Хабре, чтобы оставить комментарий