Python如何正确设置可选seed参数避免哈希播种弃用警告
问题原因
- 你使用
*seed定义可变位置参数时,无论是否传值,seed变量最终都是元组类型:不传值时为空元组(),传值时为所有传入参数打包成的元组。 random.seed()不支持元组作为合法入参,空元组的哈希值被用作种子的写法从Python 3.9开始废弃,因此触发警告。- 普通可选参数不需要用
*定义,直接设置默认值即可。
正确实现方案
基础修改(最小改动)
直接将seed参数设为默认值为None的可选参数即可,random.seed()原生支持None作为入参,此时会默认使用系统时间生成种子,和不设置种子的效果一致:
import random def random_num(n, number, seed=None): #n是待返回的数值数量,number是后续使用的均匀分布的取值范围 collect = [] random.seed(seed) for i in range(n): collect.append(round(random.uniform(-number, number),2)) return collect
调用方式和你之前的用法完全兼容:
- 不传入seed:
random_num(4,5) - 传入固定seed:
random_num(4,5, 123)或random_num(4,5, seed=123)
优化方案(避免影响全局随机状态)
上面的写法会修改random模块的全局随机数种子,可能影响其他调用random模块的代码的运行结果。更规范的写法是创建独立的随机数实例,完全隔离状态:
import random def random_num(n, number, seed=None): #n是待返回的数值数量,number是后续使用的均匀分布的取值范围 collect = [] # 创建独立随机数实例,和全局random状态互不影响 rng = random.Random(seed) for i in range(n): collect.append(round(rng.uniform(-number, number),2)) return collect
内容的提问来源于stack exchange,提问作者saZ
相关产品推荐
相关产品推荐

