#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 могут быть заменены чем угодно.