Комментарии 28
Спасибо за статью!
Спасибо за перевод. Реально интересный материал.
Прекрасный материал. Прочитал с большим интересом!
Вы забыли про bytesarray указать в списке изменяемых.
в этом языке на самом деле не существуют указателиЕсли сравнивать со статический типизированными языками, где разделяется на передачу по ссылке и передачу по значению, в питоне всегда* передается «по ссылке» (указатель на объект).
x указывает на новый PyObject.
Всё дело в интернированных (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 приводит к таким пространным статьям на столь простую для обычного программиста тему, то на питоне нельзя обучать программированию. Гораздо проще запомнить концепцию переменной «коробка с названием и адресом» чем проскочив это понимание потом разбираться в тех хитросплетениях, которые пришлось ввести, чтобы скрыть этот факт.
Пока компьютеры имеют конечную память и фон-неймановскую архитектуру, понимать устройство и принцип исполнения программы всегда будет полезно, чтобы не натыкаться на странные случаи с малейшим изменением программы, которые приводят к катастрофическим изменения в производительности.
Наивное программирование годится для небольших не очень важных программок, или одноразовых случаев, но не для программ, предназначенных испольняться часто и нагруженых фукнционалом.
Вообще, если в обучение программированию на Python приводит к таким пространным статьям на столь простую для обычного программиста тему, то на питоне нельзя обучать программированию. Гораздо проще запомнить концепцию переменной «коробка с названием и адресом» чем проскочив это понимание потом разбираться в тех хитросплетениях, которые пришлось ввести, чтобы скрыть этот факт.
Пока компьютеры имеют конечную память и фон-неймановскую архитектуру, понимать устройство и принцип исполнения программы всегда будет полезно, чтобы не натыкаться на странные случаи с малейшим изменением программы, которые приводят к катастрофическим изменения в производительности.
Наивное программирование годится для небольших не очень важных программок, или одноразовых случаев, но не для программ, предназначенных испольняться часто и нагруженых фукнционалом.
Запустите этот код в виде скрипта.
Вы подменяете условия, чтобы добиться желаемого результата.
Компилятор Cpython умеет в некоторые оптимизации, соответственно, «в виде скрипта» это будет соптимизировано(если интересны подробности — велком в исходный код Cpython). На скриншоте выше изображена интерактивная оболочка, и там работает интернирование(как минимум, в Cpython) — longobject.c#L49, на гите найдете.
Поэтому вопрос все еще открыт — как автор получил такой результат?
Компилятор Cpython умеет в некоторые оптимизации, соответственно, «в виде скрипта» это будет соптимизировано(если интересны подробности — велком в исходный код Cpython). На скриншоте выше изображена интерактивная оболочка, и там работает интернирование(как минимум, в Cpython) — longobject.c#L49, на гите найдете.
Поэтому вопрос все еще открыт — как автор получил такой результат?
Не противоречит.
Мб это опечатка? Были не 1000, а 100?
Правда, во время копирования добавить по лишнему нулю к двум строкам... Звучит как что-то невероятное
А можно для непосвящённых прояснить, для чего вообще нужна эмуляция указателей? При работе с подключаемыми библиотеками все понятно, но там даже не эмуляция, а реальные указатели, завёрнутые во вспомогательный объект. А вот именно эмуляция?) Пара примеров реального использования ответила бы на вопрос. Спасибо
Прогнал маленький тестик
Сначала добавляем, потом вычитаем.
очевидно, ссылки на константы
А вот тут уже интересней — константы кончились, результат попадает в новый объект
А при следующей операции — опять в старый…
(не, понятно что в пересозданный на том же месте)
И если константа занимает 32 байта, то объект все 640…
Сначала добавляем, потом вычитаем.
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. У меня есть идея как в своём проекте это можно использовать, но не уверен, что смогу нормально это описать.
Единственное, что точно могу сказать - это связано с настольными РПГ
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Указатели в Python: в чём суть?