首页 > 编程问答 >尝试从函数内部更改值,但退出函数时它不会改变

尝试从函数内部更改值,但退出函数时它不会改变

时间:2024-08-05 04:50:08浏览次数:6  
标签:python function variable-assignment

尝试制作一个准系统的 Pokemon 游戏并且切换不起作用

当尝试切换 Pokemon 时,我可以让代码识别 activePlayerMon= 在运行 switchOption() 函数时有一个值切换,但是一旦调试器离开该函数,它就会恢复当第一次提示您选择 Mon 时,返回到最初给定的值

def fight(playerlist, computerlist):
    print('\n',playerlist[1].name,'\n',playerlist[2].name,'\n',playerlist[3].name,'\n')
    initFight = int(input('Choose your starting Pokemon\n'))
    playerlist[int(initFight)].fightPrompt(computerlist[1])

    activePlayerMon = playerlist[initFight]
    activeComputerMon = computerlist[1]
    
    def switchOption(determine_user):
        global activePlayerMon, activeComputerMon
        if determine_user == 1:
            print('\n',playerlist[1].name,'\n',playerlist[2].name,'\n',playerlist[3].name,'\n')
            changeMon = int(input('Choose who you\'d like to switch to'))
            activePlayerMon = playerlist[changeMon]
        elif determine_user == 0:
            changeMon = randint(1,3)
            activeComputerMon = computerlist[changeMon]


    while playerlist[1].HP != 0 and playerlist[2].HP != 0 and playerlist[3].HP != 0 or computerlist[1].HP != 0 and computerlist[2].HP != 0 and computerlist[3].HP != 0:
        print('\n',activePlayerMon.name,'- \n',activePlayerMon.HP,'\ ',activePlayerMon.MHP,'\n',activeComputerMon.name,'- \n',activeComputerMon.HP,'\ ',activeComputerMon.MHP,'\n')
        fightOption = int(input('Would you like to-\n  1. Fight\n  2. Heal\n  3. Switch\n'))
        if fightOption == 1:
                << attacking function call >>
        elif fightOption == 2:
                << healing function call >>  

        elif fightOption == 3:
            switchOption(1)

我尝试了一种变体,其中 switchOption() 函数位于 Fight() 函数之外,使用 playerList[] 和 activePlayerMon= 的参数,但效果相同东西。

我还有一个版本,它只是硬编码为仅适用于玩家,但转向策略以使其更容易为计算机编码

我知道很多代码都没有优化,但我我真的坚持以模块化的方式进行这项工作。

简而言之,我该如何做到这一点,以便当 activePlayerMon 的值在 switchOption() 函数内切换时,它会保留更改而不是恢复回来为旧值?

如果需要,我愿意将文件上传到 GitHub


你遇到的问题与 global 关键字的使用方式有关。虽然你正确地使用了 global 关键字在 switchOption 函数内部修改全局变量,但你创建了一个名为 activePlayerMon 局部变量,该变量隐藏了全局变量。

为了解决这个问题,你需要在 fight 函数内部初始化 activePlayerMon activeComputerMon ,使它们成为全局变量。然后,你可以在 switchOption 函数内部修改它们,而无需使用 global 关键字。

以下修改后的代码应该可以按预期工作:

def fight(playerlist, computerlist):
    global activePlayerMon, activeComputerMon  # 声明全局变量
    print('\n', playerlist[1].name, '\n', playerlist[2].name, '\n', playerlist[3].name, '\n')
    initFight = int(input('Choose your starting Pokemon\n'))
    playerlist[int(initFight)].fightPrompt(computerlist[1])

    activePlayerMon = playerlist[initFight]  # 初始化全局变量
    activeComputerMon = computerlist[1]  # 初始化全局变量

    def switchOption(determine_user):
        if determine_user == 1:
            print('\n', playerlist[1].name, '\n', playerlist[2].name, '\n', playerlist[3].name, '\n')
            changeMon = int(input('Choose who you\'d like to switch to'))
            # 现在可以直接修改全局变量
            activePlayerMon = playerlist[changeMon]
        elif determine_user == 0:
            changeMon = randint(1, 3)
            # 现在可以直接修改全局变量
            activeComputerMon = computerlist[changeMon]

    while playerlist[1].HP != 0 and playerlist[2].HP != 0 and playerlist[3].HP != 0 or computerlist[1].HP != 0 and computerlist[2].HP != 0 and computerlist[3].HP != 0:
        print('\n', activePlayerMon.name, '- \n', activePlayerMon.HP, '\ ', activePlayerMon.MHP, '\n',
              activeComputerMon.name, '- \n', activeComputerMon.HP, '\ ', activeComputerMon.MHP, '\n')
        fightOption = int(input('Would you like to-\n  1. Fight\n  2. Heal\n  3. Switch\n'))
        if fightOption == 1:
            # << attacking function call >>
            pass
        elif fightOption == 2:
            # << healing function call >>
            pass

        elif fightOption == 3:
            switchOption(1)

在这个修改后的代码中,我们在 fight 函数内部使用 global 关键字声明了 activePlayerMon activeComputerMon 变量。这使得 switchOption 函数可以直接修改这些全局变量,而无需再次使用 global 关键字。

请注意,过度使用全局变量通常被认为是不好的做法,因为它可能会使代码更难理解和维护。在你的情况下,将这些变量作为参数传递给函数并在函数完成时返回更新后的值可能是更好的选择。

标签:python,function,variable-assignment
From: 78832082

相关文章

  • Python mido 未检测到 Raspberry Pi 中的键盘输入
    我有一个简单的python代码,它通过连接到PC的USB从音乐键盘获取MIDI信号,然后将命令发送到Arduino板以写入其数字输出。这工作得很好,没有任何问题。我尝试将相同的代码迁移到RaspberryPi,并进行一些特定于Pi的修改。我的代码如下:importpygameimportmidoimportr......
  • Python 初学者,遇到简单数学问题
    我必须做一个数学练习,要求我以10^-5的幅度构建√3。使用扫描方法和Python。我是法国人,所以我不知道是否“扫描”是正确的词。在练习的前面,我得到了一些提示:√3是方程x^2-3=0的解,我需要达到x*的点y是负数所以我尝试了这个:x=1y=1+10......
  • python字典
    字典概念一种数据结构,用于储存键值对键:值=key:value键会有对应的值,键是用来查找值的(字→键,释义→值)字典名={}要在字典里放入多个键值对,就用"{}"把它们包住,键和值之间用":"表示对应,键值对之间用","分隔。用法如果我们要获取某个键的值,在字典名后面跟方括......
  • python+flask计算机毕业设计健康管理系统的设计与实现(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景近年来,随着人们生活水平的提高和健康意识的增强,健康管理已成为社会关注的焦点。传统的健康管理方式往往依赖于纸质记录和医生的口头建议,这......
  • python+flask计算机毕业设计实验室信息化管理系统(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在当今快速发展的科技时代,实验室作为科研与教学的核心场所,其管理效率和信息化水平直接影响到研究成果的质量和速度。传统的实验室管理方式......
  • python+flask计算机毕业设计中国诗词鉴赏网站(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景中国诗词作为中华文化的重要组成部分,承载着千年的历史与文化底蕴。从古至今,诗词一直是文人墨客表达情感、描绘景象的重要工具。然而,随着时......
  • python+flask计算机毕业设计装修公司管理系统(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景近年来,随着城市化进程的加速和人们生活水平的提高,装修行业迎来了前所未有的发展机遇。然而,传统装修公司管理方式存在诸多弊端,如信息不透明......
  • Python基础算法笔记
    整理自B站视频https://www.bilibili.com/video/BV1uA411N7c5递归1.汉诺塔问题#n个圆盘,从a经过b移动到cdefhanoi(n,a,b,c):ifn>0:#将n-1个圆盘从a经过c移动到bhanoi(n-1,a,c,b)#将最底层的圆盘从a移动到cprint("mov......
  • 24412-Python链接LDAP(Kerbores)认证的Impala
    24412-Python链接LDAP(Kerbores)认证的Impala必须安装pyImpala才行pipinstallimpylaPython3.x链接LDAP(Kerbores)认证的Impala代码fromimpala.dbapiimportconnectimpala_host="172.10.194.101"impala_port="25004"impala_user='huabingood_test&......
  • Python_DAG-有向无环图-igraph
    DAG-有向无环图-igraph安装pipinstallpython-igraphpipinstallpycairopiplist发现Python安装的有igraph包有两个:igraph、python-igraph有向图 有向图(Digraph)是图论中的一种图结构,其中的边(弧)具有方向性,表明从一个节点(顶点)到另一个节点的单向关系。与无向图不同,无向......