函数不更新全局变量

时间:2016-09-23 20:35:24

标签: python

我正在为compSci类编写一个模拟Bunko游戏的程序,但我在修改全局变量scoreCalc时遇到问题playerScore。游戏使玩家对抗计算机,所以我希望能够使用一个函数来确定分数,并且只是通过一个参数来分别增加正确的分数。但是,该功能不会在多个播放中保存playerScore的值,每轮重置为0。我是新手,所以我确定这个问题很可能是微不足道的,但我感谢所有人的帮助!

dieList = []
sixCount = 0
playerScore = 0


def rollDice():    
    global sixCount
    sixCount = 0
    dieList.clear()

    die1 = random.randint(1,6)
    die2 = random.randint(1,6)
    die3 = random.randint(1,6)

    dieList.append(die1)
    dieList.append(die2)
    dieList.append(die3)

    print(dieList)

    for x in dieList:
        if x == 6:
            sixCount += 1
    print("sixCount:", sixCount)
    return


def scoreCalc(x):
    if sixCount == 1:
        x += 1
    elif sixCount == 2:
        x += 5
    elif sixCount == 3:
        x += 21
    return x


print()
print("Player's turn!")
print('*' * 30)
input("Press ENTER to roll the dice")
print()
rollDice()
print("Score:", scoreCalc(playerScore))

2 个答案:

答案 0 :(得分:5)

如果您将playerScore作为参数传递,然后在函数内对其执行操作,全局变量playerScore将无法更改

为什么呢? Python中的数字是immutable

等等,什么?是的,当您对某个数字执行任何操作并使用结果填充某个变量(例如i += 2)时,会创建一个新的数字对象。因此,当您将playerScore传递给某个函数时,会传递一个全新的对象,因此,scoreCalc得到的不是实际的playerScore,而是复制。毋庸置疑,更改副本并不会改变原件。

以下将解决这个问题:

def scoreCalc():
    global playerScore

    if sixCount == 1:
        playerScore += 1
    elif sixCount == 2:
        playerScore += 5
    elif sixCount == 3:
        playerScore += 21

    return playerScore

答案 1 :(得分:1)

您清楚地知道如何修改您为sixCount所做的全局变量。您可能曾经习惯使用playerScore,但在尝试使该函数用于计算任何人的分数(在OP中声明的目标)时更改了它。

为了使函数像函数一样工作,它需要是一个函数。这意味着它需要输入并提供输出,而其他任何事情都不重要。然后你只需要使用那个输出。

def scoreCalc(sixCount):
    x = 0
    if sixCount == 1:
        x += 1
    elif sixCount == 2:
        x += 5
    elif sixCount == 3:
        x += 21
    return x

# now use it
playerScore += scoreCalc(sixCount)

请注意scoreCalc如何不关心任何全局变量。它只是给出了输入的分数。然后,您将该分数应用于它所属的位置。

这些功能也可能有用。最好不要给它们任何全局变量。处理重要的结果,让这些功能完成它们的工作,而不是别的。

# return a list of d6 outputs
def rollDice(number_of_dice):
    return [random.randint(1,6) for _ in range(number_of_dice)]

# takes a list of d6 outputs and returns the count of sixes    
def countSixes(dieList):
    return sum([1 for x in dieList if x==6])