这是用于学校评估。我已经完成了所需的所有条件,并想添加更多与功能有关的代码。基本上,这是一个“游戏”,程序会询问您是否要帮助保卫附近的村庄。如果您说是,它将给您列出可供选择的部队清单。然后运行此代码(请记住我当前的代码运行正常)
while enemy_score>=0:
if picked_troop == 1 or picked_troop == 2 or picked_troop == 3:
shoot = input()
if shoot == 'w':
enemy_score -= random.randint(1, 10)
print(enemy_score)
if enemy_score<0:
break
enemy_score
已经设置为50,并且“如果被选中的部队”这一行是为了确保需要运行射击代码,因为射击在代码开始时大于0(因为Shoot = 50)。
我尝试将代码更改为。
def kill(enemy_score=None):
shoot = input()
if shoot == 'w':
enemy_score -= random.randint(1, 10)
print(enemy_score)
因此,我用kill代替了shoot = input()
中的所有内容,但是,当我这样做时,当按下w键时,程序将随机数设为0,然后再次返回到50。所以在控制台中看起来像这样
w
46
w
47
w
46
w
48
我如何使它连续,看起来像
w
47
w
41
w
31
etc
答案 0 :(得分:0)
问题是范围。函数enemy_score
中的kill()
与函数外部存在的enemy_score
不同。假设您有这种安排:
enemy_score = 50
...
def kill(enemy_score):
enemy_score -= 10
print(enemy_score)
print(enemy_score)
kill(enemy_score)
print(enemy_score)
您会看到此代码段的输出为
50
40
50
换句话说,外部作用域中的enemy_score
显然没有变化,而函数内部的enemy_score
很明显是 。
问题是,当您定义kill(enemy_score=...)
时,您正在说的是“我想要一个名为kill
的函数,并且希望使用一个自变量来调用它,该自变量分配给一个名为enemy_score
的变量。” Python知道您已经有一个enemy_score
变量,但是您在此函数外部声明了该变量,并且很显然,如果在函数内部以不同的方式定义它,则只要在函数内部,python将使用功能内部的版本。外部enemy_score
和内部enemy_score
是不同变量,因此更改内部enemy_score
不会更改外部enemy_score
。>
当python调用带有变量的函数(例如kill(enemy_score)
)时,它不会传入变量本身(称为 pass-by-reference -其他一些编程语言也会这样做) ,如果是这种情况,则更改内部enemy_score
会更改外部enemy_score
)。而是传递值-它复制enemy_score
的值并将其发送给函数。
现在,有两种方法可以解决此问题。首先是从全局范围继承它,而不是将enemy_score
作为变量传递:
enemy_score = 50
...
def kill():
global enemy_score # <----
enemy_score -= 10
print(enemy_score)
print(enemy_score)
kill()
print(enemy_score)
这将打印50 40 40
。
您不得不说global enemy_score
是一个怪异的python怪癖-但是当您想将 global名称空间中的变量引入函数时,您需要这样做。
第二种解决方法是让kill()
返回内部enemy_score
的值,然后对其进行更改,然后将其分配给外部enemy_score
:
enemy_score = 50
...
def kill(enemy_score):
enemy_score -= 10
print(enemy_score)
return enemy_score # <----
print(enemy_score)
enemy_score = kill(enemy_score)
print(enemy_score)
这也会按预期打印50 40 40
。
这两种解决方案都很普遍,不过根据情况的不同,使用哪种方法更好。在这种情况下,我建议使用第二个版本。