在Python中创建了两个相同的列表 - 我的功能是不更新我想要的

时间:2017-09-27 16:18:25

标签: python-2.7 pygame

这是我在Stack Overflow中的第一篇文章。经过这么多年,仅仅是一个潜伏者,我很高兴向所有人问好!

我目前正在学习在空闲时间编写代码(特别是Python)。在开发我的第二个项目时,我遇到了一个拒绝按照我的意图工作的功能。由于我无法找到任何可以帮助我找到原因的文档,所以我决定在这里工作。代码如下:

def GridConstructor(InputGrid, RedPosition, BluePosition, SquareSize, StartingPositionA, StartingPositionB):
CurrentPositionA = StartingPositionA
CurrentPositionB = StartingPositionB
x = 1
for Line in range(19):
    y = 1
    for Row in range(18):
        if [y, x] == BluePosition:
            InputGrid[str(x) + ", " + str(y)] = [CurrentPositionA, CurrentPositionB], 1
            print CurrentPositionA, CurrentPositionB
        elif [y, x] == RedPosition:
            InputGrid[str(x) + ", " + str(y)] = [CurrentPositionA, CurrentPositionB], 2
            print CurrentPositionA, CurrentPositionB
        else:
            InputGrid[str(x) + ", " + str(y)] = [CurrentPositionA, CurrentPositionB], 0
            print CurrentPositionA, CurrentPositionB
        y += 1
        CurrentPositionA[1] += SquareSize
        CurrentPositionB[1] += SquareSize
    x += 1
    CurrentPositionA[0] += SquareSize
    print CurrentPositionA[0]
    CurrentPositionB[0] += SquareSize
    print CurrentPositionB[0]
    CurrentPositionA[1] = StartingPositionA[1]
    print CurrentPositionA[1]
    print StartingPositionA[1]
    CurrentPositionB[1] = StartingPositionB[1]
    print CurrentPositionB[1]
    print StartingPositionB[1]

(请随意忽略' print',他们会在那里进行调试)。

正如您所看到的,创建一个以网格模式存储[x,y]坐标的字典非常简单。从调试来看,问题似乎是在添加SquareSize'到#PurrentPositionA'和' CurrentPositionB'在第二个'为'循环,' SquareSize'的值由于某种原因被添加到' StartingPositionA'和' StartingPositionB',这意味着当前位置跟踪器的y值在第一个for循环的每次迭代结束时不会重置为其原始值。我完全不知道为什么函数会这样做,我找不到任何可以帮助我的文档。我确定这是一个非常愚蠢的,基本的错误,但如果有人可以帮助我,我会非常感激。

干杯!

1 个答案:

答案 0 :(得分:0)

由于这两个赋值语句,问题正在发生。

CurrentPositionA = StartingPositionA
CurrentPositionB = StartingPositionB

让我解释一下这个问题

list1 = [1,2]
list2 = list1
list1[1] = 3
print(list1)
print (list2)
print (id(list1))
print (id(list2))

输出: -

[1, 3]
[1, 3]
139674729442312
139674729442312

这是因为list1,list2变量指向相同的内存位置,通过更改一个变量中的内容来更改其他变量中的内容 这不是你所期望的。 要避免此问题,您需要对对象进行深度检查,而不仅仅是分配。

import copy
list1 = [1,2]
list2 = copy.deepcopy(list1)
list1[1] = 3
print(list1)
print (list2)
print (id(list1))
print (id(list2))

输出: -

[1, 3]
[1, 2]
139997249899528
139997259457928

基本上用以下命令替换CurrentPositionA,CurrentPositionB赋值,看它是否有效(导入副本后)。

CurrentPositionA = copy.deepcoy(StartingPositionA)
CurrentPositionB = copy.deepcopy(StartingPositionB)