Python - 在For循环中更新变量

时间:2013-02-13 16:36:48

标签: python

所以我决定用Python编写Monopoly,但是我在更新玩家位置时遇到了一些麻烦。我写了一个for循环,遍历玩家,为每个玩家掷骰子,然后更新他们的位置。问题是位置变量没有保留最新位置,它在for循环开始时保持重置为0。这是我的代码:

player1location = 0

def turn(numberPlayers, player, player1location, Board):
    for player in range(numberPlayers):
        player = 'Player'+str(player+1)
        print 'It\'s', player, 'turn!'
        print player1location
        rollDice = raw_input('Press Enter to roll the dice!')
        diceRoll = random.randint(1,6)
        print player, 'rolled a', diceRoll
        player1location = player1location + diceRoll
        print 'You landed on', player1location
        print '\n'

while True:
    turn(numberPlayers, player, player1location, Board)

如果有必要,我可以提供更多代码,但我认为这是控制玩家位置的所有内容。谢谢!

编辑:显然我正在改变局部变量而不是全局变量。我将如何更改全局变量?

2 个答案:

答案 0 :(得分:8)

您的函数参数与要更新的目标变量同名。 因此,您所做的任何更改都是对函数参数进行的,而不是对全局变量进行的。那是因为function为您传递给函数的参数创建了一个局部范围。因此,它覆盖了全局使用相同名称定义的变量。

因此,要么更改函数参数player1location的名称,要么更改全局变量的名称。

答案 1 :(得分:1)

请注意,您有两个名为player1location的变量 - 一个在您的第一行(在任何函数之外)定义全局player1location = 0,第二个创建每次调用函数时,本地def turn(numberPlayers, player, player1location, Board)。尽管它们具有相同的名称,但它们是python中的两个不同变量,因为它们是在different scopes中定义的。

有几种方法可以解决这个问题。

您可以从函数定义中删除player1location,然后您将始终更改全局范围的变量。但是,根据你的命名惯例,我猜你也想为其他玩家重复使用这个功能(尽管尝试它仍然没有什么坏处,可以帮助你理解它是如何工作的。)

更好的方法可能是在函数末尾返回新的玩家位置(return player1location),然后在返回时将其分配给全局范围的位置(player1location = turn(numberPlayers, player, player1location, Board))。 / p>