当我尝试定义代码时不起作用

时间:2018-11-19 02:48:07

标签: python python-3.x function

这是用于学校评估。我已经完成了所需的所有条件,并想添加更多与功能有关的代码。基本上,这是一个“游戏”,程序会询问您是否要帮助保卫附近的村庄。如果您说是,它将给您列出可供选择的部队清单。然后运行此代码(请记住我当前的代码运行正常)

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

1 个答案:

答案 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

这两种解决方案都很普遍,不过根据情况的不同,使用哪种方法更好。在这种情况下,我建议使用第二个版本。