You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 19:03:31