这是我在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循环的每次迭代结束时不会重置为其原始值。我完全不知道为什么函数会这样做,我找不到任何可以帮助我的文档。我确定这是一个非常愚蠢的,基本的错误,但如果有人可以帮助我,我会非常感激。
干杯!
答案 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)