
本文讲解如何避免模块级变量“只计算一次”的陷阱,通过将随机逻辑封装为函数,在多次调用时获得不同结果,适用于d&d自动化工具等需要动态值的场景。
本文讲解如何避免模块级变量“只计算一次”的陷阱,通过将随机逻辑封装为函数,在多次调用时获得不同结果,适用于d&d自动化工具等需要动态值的场景。
在Python中,模块(如 d6.py)的顶层代码仅在首次导入时执行一次。如果你在 d6.py 中直接写 d6 = random.randint(1, 6),那么该表达式只运行一次,d6 变量被赋予一个固定的整数值(例如 4),后续无论多少次 from d6 import * 或重复访问 d6,得到的都是同一个数字——这显然不符合骰子“每次投掷都应随机”的语义。
✅ 正确做法是:将随机行为封装为函数,而非赋值为模块变量。函数每次被调用时都会重新执行内部逻辑,从而返回新结果。
修改 d6.py 如下:
import random
def d6():
"""返回 1–6 之间的随机整数,模拟一个六面骰子。"""
return random.randint(1, 6)然后在 diceroller.py 中调用函数(注意括号 ()):
图片提示词生成器?不止如此。 马甲系统 —— 把脑海中的画面,翻译成AI能理解的专业表达。 用得越多,它越懂你:首次需要多问几句确认方向,用久了几乎一说就懂。 用得越多,它越快:缓存机制让后续对话越来越省。 RAG进化:成功案例持续入库,越跑越聪明。 输入「新手指南」查看完整功能介绍
立即学习“Python免费学习笔记(深入)”;
from d6 import d6 # 推荐显式导入,而非 from d6 import * print(d6()) # 输出例如:3 print(d6()) # 输出例如:5 —— 每次都是独立随机!
? 小贴士:
- 避免使用
from module import *,它会污染命名空间且降低可读性;推荐from d6 import d6或import d6; d6.d6(); - 可进一步扩展为支持多面骰(如
d20()、d8())或批量投掷(如def roll_dice(n=1, sides=6): return [random.randint(1, sides) for _ in range(n)]); - 若需可重现结果(如调试或存档),可在
d6.py开头添加random.seed(42)—— 但生产环境通常应省略,以保证真正随机。
总结:模块变量是“快照”,函数才是“动作”。要获得动态行为,请始终把可变逻辑放在函数体内,并通过调用(而非引用)触发执行。

















