Nano Hash - криптовалюты, майнинг, программирование

Принудительно скопировать небольшой int в Python

В качестве игрушечной задачи я попытался придумать объекты a, b такие, что

type(a) == type(b) == int # True
a + 1 == b + 1 == 1       # True
a is b                    # False

Кажется, что deepcopy возвращается к _deepcopy_atomic, как обсуждалось ">здесь.

Можно ли создать копию небольшого int в Python?

03.03.2020

  • Я не могу придумать способ изнутри Python (но я не буду отвечать, так как не могу доказать отрицательное: P). Вы можете создать собственный модуль, который создаст новый целочисленный объект с заданным значением, но это может сломать или не сломать что-то. Из любопытства, зачем вам копия неизменяемого объекта? 03.03.2020
  • Амадан: Я не имею в виду точного понятия копии, думаю, я бы согласился возиться с поведением «есть» Python :) 03.03.2020

Ответы:


1

Да, это возможно, и без низкоуровневых хаков или читов:

>>> a = 0
>>> b = 9**99 % 9**99
>>> type(a) == type(b) == int
True
>>> a + 1 == b + 1 == 1
True
>>> a is b
False

Я делаю это локально с Python 3.8.1, но вы также можете воспроизвести его на repl.it и на www.python.org/shell/.

Для небольших плюсов:

>>> a = 7
>>> b = (9**99 + a) % 9**99
>>> b, type(b), a == b, a is b
(7, <class 'int'>, True, False)

Для небольших минусов:

>>> a = -2
>>> b = (9**99 + a) % -9**99
>>> b, type(b), a == b, a is b
(-2, <class 'int'>, True, False)
10.03.2020

2

Ответ на ваш вопрос зависит от того, что вы считаете small int. Согласно документации:

Текущая реализация хранит массив целочисленных объектов для всех целых чисел от -5 до 256, когда вы создаете int в этом диапазоне, вы фактически просто возвращаете ссылку на существующий объект.

В случае целых чисел строка a is b эквивалентна id(a) == id(b). Для диапазона [-5, 256] идентификаторы для всех номеров предопределены, что означает, что a и b действуют как псевдонимы для существующего объекта.

Единственный способ, которым a, b удовлетворит вашему условию a + 1 == b + 1 == 1, это когда a = b = 0. Поскольку 0 находится в вышеупомянутом диапазоне, невозможно заставить a is b возвращать False.

05.03.2020
  • Спасибо, ссылка была очень полезной, особенно это: Таким образом, должна быть возможность изменить значение 1. Мы можем отредактировать расположение памяти int, чтобы получить поведение, которое я искал. 06.03.2020

  • 3

    Вероятно, это не является целью вопроса, но 3 утверждения в вопросе могут быть удовлетворены, если int разрешено переопределять, так что следующий код будет проходить:

    int = type('', (int,), dict(vars(int)))
    a = int(0)
    b = int(0)
    assert type(a) == type(b) == int
    assert a + 1 == b + 1 == 1
    assert a is not b
    
    06.03.2020
  • ха, достаточно честно. В том же духе можно определить type = lambda x: int и использовать пользовательские классы для a и b. 07.03.2020

  • 4

    Мне удалось заставить работать для CPython следующее:

    import ctypes
    
    x = 2
    y = 3
    
    ctypes.c_int.from_address(id(y) + 24).value = x
    
    print(x == y) # True
    print(x is y) # False
    

    Я не мог обойтись без x = 0 или x = 1 без сбоя интерпретатора.

    06.03.2020
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..