Python:D&D 5e角色生成器中while循环后list为空的问题
D&D 5e属性生成器列表为空问题解析
核心原因是函数内部的abset是局部变量,和全局作用域的abset不是同一个对象。循环里打印的是函数内的局部列表,退出函数后这个局部变量会被Python回收销毁,全局的abset自然保持初始的空状态。
常见触发场景
- 你在函数
abrl内部直接执行了abset = []这类赋值操作,这会在函数内创建一个全新的局部列表,完全独立于全局的abset。 - 即便全局已经定义了
abset,如果函数内没有声明要使用全局变量,Python会默认将赋值操作的变量判定为局部变量。
两种解决办法
1. 声明使用全局变量
在函数开头用global关键字明确指定要操作的是全局abset,这样函数内的所有操作都会直接作用于全局列表:
import random abset = [] def abrl(): global abset while len(abset) < 6: # 掷4d6去最低求和 rolls = [random.randint(1,6) for _ in range(4)] rolls.remove(min(rolls)) abset.append(sum(rolls)) print(abset) # 此时打印的是全局列表 abrl() print(abset) # 全局列表已被函数修改,不再为空
2. 让函数返回生成的列表(更推荐)
避免依赖全局变量,让函数负责生成属性列表并返回,再将返回值赋值给变量使用。这种写法更清晰,也不会产生全局变量的副作用:
import random def abrl(): abset = [] while len(abset) < 6: rolls = [random.randint(1,6) for _ in range(4)] rolls.remove(min(rolls)) abset.append(sum(rolls)) print(abset) # 打印局部生成的列表 return abset # 调用函数并接收返回的属性列表 abset = abrl() print(abset) # 此时变量持有函数生成的完整列表
内容的提问来源于stack exchange,提问作者jomake
相关产品推荐
相关产品推荐

