Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 函数不更新全局变量_Python - Fatal编程技术网

Python 函数不更新全局变量

Python 函数不更新全局变量,python,Python,我正在为我的compSci类编写一个模拟Bunko游戏的程序,但是在获取函数scoreCalc以修改全局变量playerScore时遇到问题。这个游戏让一个玩家和电脑对抗,所以我希望能够使用一个函数来确定分数,然后通过一个in参数来分别增加正确的分数。但是,该功能不会在多个播放中保存playerScore的值,并在每一轮中重置为0。我对函数是新手,所以我相信这个问题可能是无关紧要的,但我感谢所有的帮助 dieList=[] 六计数=0 playerScore=0 def rollDice():

我正在为我的compSci类编写一个模拟Bunko游戏的程序,但是在获取函数
scoreCalc
以修改全局变量
playerScore
时遇到问题。这个游戏让一个玩家和电脑对抗,所以我希望能够使用一个函数来确定分数,然后通过一个in参数来分别增加正确的分数。但是,该功能不会在多个播放中保存
playerScore
的值,并在每一轮中重置为0。我对函数是新手,所以我相信这个问题可能是无关紧要的,但我感谢所有的帮助

dieList=[]
六计数=0
playerScore=0
def rollDice():
全球六位数
六计数=0
dieList.clear()
die1=random.randint(1,6)
die2=随机随机随机数(1,6)
die3=随机的随机数(1,6)
dieList.append(die1)
dieList.append(die2)
dieList.append(die3)
打印(死亡名单)
对于dieList中的x:
如果x==6:
六计数+=1
打印(“六计数:”,六计数)
回来
def计分卡(x):
如果sixCount==1:
x+=1
elif sixCount==2:
x+=5
elif sixCount==3:
x+=21
返回x
打印()
打印(“轮到玩家了!”)
打印('*'*30)
输入(“按回车键掷骰子”)
打印()
滚动骰子()
打印(“分数:”,分数计算(球员核心))

如果将
playerScore
作为参数传递,然后在函数中对其执行操作,则全局变量
playerScore
不会更改

为什么??Python中的数字是

等等,什么??是的,当您对一个数字执行任何操作并用结果填充某个变量(例如,
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

您清楚地知道如何修改全局变量,这是您为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])

非常感谢。这正是我想要的:)谢谢你的提示!我不知道数字的属性。你让我离目标更近了一点,但我仍然希望使用相同的函数来修改计算机分数