在 Python3 中,random.Random(seed) 允许使用字节数组进行播种。class Random(_random.Random): ... def __init__(self, x=None): self.seed(x) ... def seed(self, a=None, version=2): ... if version == 2 and isinstance(a, (str, bytes, bytearray)): if isinstance(a, str): a = a.encode() a += _sha512(a).digest() a = int.from_bytes(a, 'big') ...当你尝试>>> random.Random().__init__(bytearray([1, 2, 3]))或者>>> r = random.Random()>>> r.seed(bytearray([1, 2, 3]))它会毫无例外地工作。但是当你尝试这个时,结果是不一致的。>>> random.Random(bytearray([1, 2, 3]))TypeError: unhashable type: 'bytearray'我编译并调试了 python 3.7.0 二进制文件,当尝试用字节数组初始化 PRNG 时,它会调用random_seedModules/_randommodule.c 中的方法并在此处直接引发类型错误。为什么?
2 回答
芜湖不芜
TA贡献1796条经验 获得超7个赞
异常不是来自Random.__init__()方法,而是来自__new__()之前调用的方法__init__():
>>> random.Random.__new__(random.Random, bytearray([1,2,3]))
TypeError: unhashable type: 'bytearray'
>>> random.Random.__new__(random.Random, bytes([1,2,3]))
<random.Random at 0x1b0cd78>
精慕HU
TA贡献1845条经验 获得超8个赞
BlackJack 的回答启发了我。我仔细阅读了该方法的C源代码_random.Random.__new__
。
在_random.Random.__new__
(方法random_new
C)中调用_random.Random.seed
方法(random_seed
使用相同的参数中C)。如果args
在random_seed
功能包含非int对象作为一个种子,它会尝试获得哈希值的对象。因此,当对象是字节数组时,它会引发类型错误。
因此,_random.Random
并没有专门处理 bytearray 的播种,但它的子类random.Random
做了,这似乎是一个不兼容的 python 错误。
添加回答
举报
0/150
提交
取消