函数vs ifstatement:函数不工作,但函数中的代码在函数外部工作?

2024-04-27 23:45:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我当时正在为Pathfinder 3.5构建一个随机字符生成器,结果卡住了

我正在使用“填充技能”(技能字符串、绘图、技能列表、类技能):函数来填充随机化的技能列表,其中包含基于类的总积分、类奖金和积分购买。因此,模拟玩家的动作,为他们的角色挑选技能

下面的例子是向导

我选择知识奥术作为技能,并在其上花费我的一个技能点池(通过使用我的智力调整+2计算)。因此,该技能现在等于我的智力调整值(+1),作为向导的职业技能加成(+3),加上我总共花费的点数(+1),总共5

问题是,当函数打印正确的结果5时,未完成的变量不会填充最终的总数。为了继续我们的示例,我在Knowledge_Arcana上运行函数,得到+5,然后在函数调用后检查Knowledge_Arcana,得到+1。相反,如果我把函数写成一个if语句,它就会工作。示例位于用于比较的函数旁边

有人知道为什么我会得到不同的结果吗

## Creating the lists and breaking into two separate sections

Int_Mod = 1
Skill_Ranks = 3
Rand_Class = 'Wizard'
Knowledge_Arcana = Int_Mod
Knowledge_Dungeoneering = Int_Mod
Wizard_Class_Top_Skills = ["Knowledge_Arcana"]
Wizard_Class_Less_Skills = ["Knowledge_Dungeoneering"]
Class_Skill = 3
Important_Skills_Weighted = .6
Less_Important_Skills_Weighted = .4
Important_Skills_Total_Weighted = round(Skill_Ranks*Important_Skills_Weighted)
Less_Skill_Total_Weighted = round(Skill_Ranks*Less_Important_Skills_Weighted)
Wiz_Draw =['Knowledge_Arcana', 'Knowledge_Dungeoneering']


def Populate_Skills(Skill_String, Draw, Skill_List, Class_Skill):
    if Skill_String in Draw:
        Skill_List = Skill_List + Class_Skill + Draw.count(Skill_String)
        print(Skill_String, Skill_List)
    else:
        print('Nuts!')



## Function Calls

Populate_Skills('Knowledge_Arcana', Wiz_Draw, Knowledge_Arcana, Class_Skill)
Populate_Skills('Knowledge_Dungeoneering', Wiz_Draw, Knowledge_Dungeoneering, Class_Skill)

print(Knowledge_Arcana,Knowledge_Dungeoneering)

我相信是被编辑成MRE的。对不起,伙计们,我是新来的


Tags: 函数string技能skillsskilllistclassint
1条回答
网友
1楼 · 发布于 2024-04-27 23:45:07

您正在传递对列表的引用,并期望函数对其进行修改;但是您在函数内部重新分配变量,该函数创建了一个局部变量,当函数退出时,该局部变量将丢失。您希望操作调用方传入的同一个变量

def Populate_Skills(Skill_String, Draw, Skill_List, Class_Skill):
    if Skill_String in Draw:
        Skill_List.extend(Class_Skill + Draw.count(Skill_String))
        print(Skill_String, Skill_List)
    else:
        print('Nuts!')

或者,让函数返回新值,并要求调用者拾取该值并将其分配给变量

def Populate_Skills(Skill_String, Draw, Skill_List, Class_Skill):
    if Skill_String in Draw:
        Skill_List = Skill_List + Class_Skill + Draw.count(Skill_String)
        print(Skill_String, Skill_List)
    else:
        print('Nuts!')
    return Skill_List

Skill_List = Populate_Skills('Knowledge_Arcana', Wiz_Draw, Knowledge_Arcana, Class_Skill)
# etc

您应该可能也重命名您的变量(类和全局变量应使用大写字母;常规Python函数和变量应使用snake_case),并避免使用全局变量。整个程序看起来应该考虑将其重构为对象,但这远远超出了您所要求的范围

相关问题 更多 >