有没有办法更改Python对象';运行时的字节表示?

有没有办法更改Python对象';运行时的字节表示?,python,byte,Python,Byte,目标是模拟高辐射环境 通常,代码如下所示: a = 5 print(a) print(a) 将打印: 5 5 我希望能够在运行时随机更改a的底层字节表示形式(根据某个预定义函数,该函数包含一个种子)。在这种情况下,应使用以下代码: a = RandomlyChangingInteger(5) print(a) print(a) 可能导致: 4 2 在C代码和C++语言中,一种方法是在编译代码中使用“ A”之前插入额外的指令,这些指令可能会修改 A/COD>。 像这样的东西(使用valgr

目标是模拟高辐射环境

通常,代码如下所示:

a = 5
print(a)
print(a)
将打印:

5
5
我希望能够在运行时随机更改
a
的底层字节表示形式(根据某个预定义函数,该函数包含一个种子)。在这种情况下,应使用以下代码:

a = RandomlyChangingInteger(5)
print(a)
print(a)
可能导致:

4
2
在C代码和C++语言中,一种方法是在编译代码中使用“<代码> A<代码>”之前插入额外的指令,这些指令可能会修改<代码> A/COD>。 像这样的东西(使用valgrind)是我在想的


这在Python中是可能的吗?

您可以这样做。内置的
int
是不可变的,因此不能修改其值。但是,您可以创建一个模拟
int
的自定义类:

import random


class RandomlyChangingInteger(object):
    def __int__(self):
        return random.randint(0, 10)

    def __str__(self):
        return str(self.__int__())
然后

应该打印类似于

4
5

注意,你不能用这个类来做数学。您必须首先实现其他
int
方法(例如
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。内置的
int
是不可变的,因此不能修改其值。但是,您可以创建一个模拟
int
的自定义类:

import random


class RandomlyChangingInteger(object):
    def __int__(self):
        return random.randint(0, 10)

    def __str__(self):
        return str(self.__int__())
然后

应该打印类似于

4
5

注意,你不能用这个类来做数学。您必须首先实现其他
int
方法(例如
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。辐射效应更可能使Python程序崩溃,而不是将对象的值更改为另一个有效值。这使得模拟辐射效应不是很有用

CPython实现依赖于如此多的指针和如此多的间接寻址,以至于在数据中经过几次翻转之后,其中至少一个指针几乎肯定会碰到导致崩溃的东西。可能会损坏对象的类型指针,导致下次尝试对该对象执行几乎任何操作时内存访问错误,或者可能会损坏引用计数,导致对象在仍在使用时被释放。可能会破坏int的长度(Python int是可变宽度),导致Python试图读取超过分配末尾的内容

如果一个int的C数组可能只是一个巨大的数字数据块,在这里可以检测或管理随机位损坏,那么一个int的Python列表主要是指针和其他元数据


如果你真的想模拟随机位翻转,最好的方法可能是使用像你链接的位翻转一样的工具来重建CPython。

你试图模拟辐射引起的位翻转,但你对这一点的期望远远超出了目标。辐射效应更可能使Python程序崩溃,而不是将对象的值更改为另一个有效值。这使得模拟辐射效应不是很有用

CPython实现依赖于如此多的指针和如此多的间接寻址,以至于在数据中经过几次翻转之后,其中至少一个指针几乎肯定会碰到导致崩溃的东西。可能会损坏对象的类型指针,导致下次尝试对该对象执行几乎任何操作时内存访问错误,或者可能会损坏引用计数,导致对象在仍在使用时被释放。可能会破坏int的长度(Python int是可变宽度),导致Python试图读取超过分配末尾的内容

如果一个int的C数组可能只是一个巨大的数字数据块,在这里可以检测或管理随机位损坏,那么一个int的Python列表主要是指针和其他元数据


如果您真的想模拟随机位翻转,最好的方法可能是使用您链接的BITFLIPS之类的工具重建CPython。

我非常熟悉Python的随机数生成功能。问题是关于对象的字节表示。我不仅对整数感兴趣。此外,我不会在(面向用户的)代码中调用任何resample()函数。。。想要随机破坏你的记忆。我理解正确吗?你为什么要这么做?您的程序将在高辐射环境中运行吗?是的,您可以在Python中插入适当的代码,就像其他通用语言一样。然而,你想要的效果还不清楚。是的,正确!我想模拟辐射效应。请参见发布的BITFLIPS链接!只是一个关于如何开始的链接会很有帮助。我不理解反对票,我认为这个问题提出得很好。让我知道我是否应该改变什么。我非常熟悉Python的随机数生成功能。问题是关于对象的字节表示。我不仅对整数感兴趣。此外,我不会在(面向用户的)代码中调用任何resample()函数。。。想要随机破坏你的记忆。我理解正确吗?你为什么要这么做?您的程序将在高辐射环境中运行吗?是的,您可以在Python中插入适当的代码,就像其他通用语言一样。然而,你想要的效果还不清楚。是的,正确!我想模拟辐射效应。请参见发布的BITFLIPS链接!只是一个关于如何开始的链接会很有帮助。我不理解反对票,我认为这个问题提出得很好。如果我需要改变什么,请告诉我。谢谢!问题是,对于我想要修改的每一种对象类型,我都必须将其子类化(正如您所指出的,我还必须实现这些其他方法)。我想知道修改对象的字节级表示是否允许我绕过所有这些。我愿意做一个修改