python函数在列表中递增变量没有明显的原因

时间:2014-11-03 00:19:22

标签: python list increment

所以我是Python的新手,我有这个问题,我不明白。这是代码:

(敌人和玩家都是包含2个变量的列表,例如[1,2])

def AIenemyTurn(enemy,playerPos):
    startPos = enemy
    print(startPos)
    potEnemyPos = enemy
    if playerPos[0] > enemy[0]:
        potEnemyPos[0] += 1
    elif playerPos[0] < enemy[0]:
        potEnemyPos[0] -= 1
    elif playerPos[1] > enemy[1]:
        potEnemyPos[1] += 1
    elif playerPos[1] < enemy[1]:
        potEnemyPos[1] -= 1
    if potEnemyPos not in rocks:
        print(potEnemyPos)
        print(startPos)
        return potEnemyPos
    else:
        return startPos

这是壳牌中出现的内容:

[1, 2]
[2, 2]
[2, 2]

为什么startPos在第二次打印时有所不同?我还没有在函数中修改它

1 个答案:

答案 0 :(得分:1)

这是因为列表是可变的,因此将它们分配给两个不同的值意味着这两个值都引用相同的列表:

>>> x = [2, 2]
>>> y = x
>>> z = x
>>> z[1] = 0
>>> z
[2, 0]
>>> y
[2, 0]

您还可以查看id s:

进行检查
>>> id(y)
4300734408
>>> id(z)
4300734408
>>> id(x)
4300734408
>>> 

解决此问题的一种方法是致电startPos = list(enemy),因为转换为list会生成一个新列表:

>>> a = [1, 2]
>>> b = list(a)
>>> id(a)
4300922320
>>> id(b)
4300922680
>>> 

以下是您编辑的代码:

def AIenemyTurn(enemy,playerPos):
    startPos = list(enemy)
    print(startPos)
    potEnemyPos = enemy
    if playerPos[0] > enemy[0]:
        potEnemyPos[0] += 1
    elif playerPos[0] < enemy[0]:
        potEnemyPos[0] -= 1
    elif playerPos[1] > enemy[1]:
        potEnemyPos[1] += 1
    elif playerPos[1] < enemy[1]:
        potEnemyPos[1] -= 1
    if potEnemyPos not in rocks:
        print(potEnemyPos)
        print(startPos)
        return potEnemyPos
    else:
        return startPos