为了账号安全,请及时绑定邮箱和手机立即绑定

Python random.Random(bytearray) TypeError:

Python random.Random(bytearray) TypeError:

慕桂英3389331 2021-09-14 16:00:30
在 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>


查看完整回答
反对 回复 2021-09-14
?
精慕HU

TA贡献1845条经验 获得超8个赞

BlackJack 的回答启发了我。我仔细阅读了该方法的C源代码_random.Random.__new__

_random.Random.__new__(方法random_newC)中调用_random.Random.seed方法(random_seed使用相同的参数中C)。如果argsrandom_seed功能包含非int对象作为一个种子,它会尝试获得哈希值的对象。因此,当对象是字节数组时,它会引发类型错误。

因此,_random.Random并没有专门处理 bytearray 的播种,但它的子类random.Random做了,这似乎是一个不兼容的 python 错误。


查看完整回答
反对 回复 2021-09-14
  • 2 回答
  • 0 关注
  • 241 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信