Python中全局变量enemy_1_alive无法修改的技术咨询
全局变量无法修改的原因分析与解决方法
问题原因
- 参数传递为值副本:Python中布尔值属于不可变类型,调用
mission(enemy_1_alive, ...)时,只是把enemy_1_alive的当前值(True)复制给函数参数alive。函数内修改alive = False仅改变局部参数的值,和外部全局变量完全无关。 global声明未生效:虽然函数里写了global enemy_1_alive,但全程没有直接对该全局变量赋值,等于这个声明没有发挥作用。而且该声明仅针对enemy_1_alive,处理enemy_2_alive时同样会出现问题。
解决方法
方法1:直接操作对应全局变量(区分不同敌人)
修改函数,让它接收敌人标识,直接操作对应的全局变量:
import time enemy_1_alive = True enemy_1_reward = 2000 enemy_2_alive = True enemy_2_reward = 3000 def mission(enemy_num, reward): global enemy_1_alive, enemy_2_alive # 根据敌人编号匹配对应全局变量 if enemy_num == 1: current_alive = enemy_1_alive elif enemy_num == 2: current_alive = enemy_2_alive else: print("无效敌人编号") return if current_alive: # 直接修改目标全局变量 if enemy_num == 1: enemy_1_alive = False else: enemy_2_alive = False print(f"击杀敌人{enemy_num},获得奖励{reward}") else: print(f'你已经击杀敌人{enemy_num}了!') time.sleep(2) mission(1, enemy_1_reward) mission(2, enemy_2_reward)
方法2:用可变对象封装状态(更推荐,减少全局变量操作)
把敌人的状态和奖励放到字典(可变对象)中,函数修改字典内的元素时,会直接改变原对象:
import time enemies = { "enemy_1": {"alive": True, "reward": 2000}, "enemy_2": {"alive": True, "reward": 3000} } def mission(enemy_key): enemy = enemies[enemy_key] if enemy["alive"]: enemy["alive"] = False print(f"击杀{enemy_key},获得奖励{enemy['reward']}") else: print(f'你已经击杀{enemy_key}了!') time.sleep(2) mission("enemy_1") mission("enemy_2")
方法3:返回修改后的状态,外部重新赋值
让函数返回处理后的存活状态,在外部重新赋值给全局变量:
import time enemy_1_alive = True enemy_1_reward = 2000 enemy_2_alive = True enemy_2_reward = 3000 def mission(alive, reward): if alive: print(f"获得奖励{reward}") return False else: print('你已经击杀他了!') time.sleep(2) return alive # 外部接收返回值并更新全局变量 enemy_1_alive = mission(enemy_1_alive, enemy_1_reward) enemy_2_alive = mission(enemy_2_alive, enemy_2_reward)
内容的提问来源于stack exchange,提问作者123awdc
相关产品推荐
相关产品推荐

