Делая переменную отрицательной с модификацией памяти

#python #memory #ctypes

Вопрос:

Я работал над простой программой, которая изменяет значения памяти с id() помощью функции. По большей части это работает, но что-то странное происходит, когда я пытаюсь присвоить отрицательное положительное значение (например, от 4 до -4). Вместо этого я получаю значение -253, если начну со значения 3. Как мне это исправить и почему это происходит?

Код:

 import ctypes
import sys

def mutate(obj, new_obj):
    if sys.getsizeof(obj) != sys.getsizeof(new_obj):
        raise ValueError('objects must have same size')

    mem = (ctypes.c_byte * sys.getsizeof(obj)).from_address(id(obj))
    new_mem = (ctypes.c_byte * sys.getsizeof(new_obj)).from_address(id(new_obj))

    for i in range(len(mem)):
        mem[i] = new_mem[i]
        
x = 3
y = 5

print(x)
mutate(x, y)
print(x)
print()


x = 4
y = -4
print(x)
mutate(x, y)
print(x)
 

Выход:

 3
5

4
-252

(Exit code -1073740940)
 

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

1. Похоже, что вы также скопируете количество ссылок. Это приведет к сбоям/утечкам.

2. Целые числа неизменяемы, и существует пул целых чисел для значений -5… 255, изменение которых может привести к очень странным результатам…

3. Что сказал @ead. Это может привести (и приводит, в моей системе) к сбою Python. Мне повезло больше с 999 и -999, так как это число не кэшируется, и оно также работало так, как вы предполагали, но изменение «неизменяемого целочисленного объекта» приведет к нарушению, особенно если это часто используемое число.

4. Какова цель всего этого? Похоже на проблему XY .

5. @CristiFati Цель состоит в том, чтобы просто узнать что-то об изменении памяти с помощью языка высокого уровня, и переменные x, y могут быть заменены чем угодно.