将相同的值赋给变量会产生不同的结果

Assigning same value to a variable yields a different result

在 python 编写游戏代码时,我遇到了部分代码问题。在一些调试过程中,我 运行 遇到了一些我无法解释的非常奇怪的事情。 我展示的第一个代码将某个值打印到数组 'polygon'。第二个代码是相同的,但最后我将第一个代码打印的值分配给数组 'polygon'。我显然希望程序的其余部分(我没有显示)以与第一个或第二个代码相同的方式运行,因为它们最终给 'polygon' 相同的值。然而,第二个代码使程序的其余部分工作,但第一个代码没有。

对于我的生活,我无法弄清楚发生了什么。我不提供程序的其余部分,因为我认为它是多余的,因为它在第一种情况和第二种情况下是相同的。

有人知道是什么原因造成的吗?感谢您的帮助。

第一个密码:

if 1:
    dimensions = 3
    polygon = [[[100,100],[100,-100]],[[100,-100],[-100,-100]],[[-100,-100],[-100,100]],[[-100,100],[100,100]]]
    for limeJuice in range(dimensions-2):
        p = copy.deepcopy(polygon)
        for j in range(len(p)):
            p[j][0].append(100)
            p[j][1].append(100)
        bob = copy.deepcopy(polygon)
        for j in range(len(bob)):
            bob[j][0].append(-100)
            bob[j][1].append(-100)
        q = []
        for j in range(len(p)):
            q.append([p[j][0],bob[j][0]])
        polygon = []
        for pearJuice in p: polygon.append(pearJuice)
        for pearJuice in bob: polygon.append(pearJuice)
        for pearJuice in q: polygon.append(pearJuice)
        print(polygon)

#rest of the programme


#--------------------------------------------------------------------#
#second code:

if 1:
    dimensions = 3
    polygon = [[[100,100],[100,-100]],[[100,-100],[-100,-100]],[[-100,-100],[-100,100]],[[-100,100],[100,100]]]
    for limeJuice in range(dimensions-2):
        p = copy.deepcopy(polygon)
        for j in range(len(p)):
            p[j][0].append(100)
            p[j][1].append(100)
        bob = copy.deepcopy(polygon)
        for j in range(len(bob)):
            bob[j][0].append(-100)
            bob[j][1].append(-100)
        q = []
        for j in range(len(p)):
            q.append([p[j][0],bob[j][0]])
        polygon = []
        for pearJuice in p: polygon.append(pearJuice)
        for pearJuice in bob: polygon.append(pearJuice)
        for pearJuice in q: polygon.append(pearJuice)
        polygon = [[[100, 100, 100], [100, -100, 100]], [[100, -100, 100], [-100, -100, 100]], [[-100, -100, 100], [-100, 100, 100]], [[-100, 100, 100], [100, 100, 100]], [[100, 100, -100], [100, -100, -100]], [[100, -100, -100], [-100, -100, -100]], [[-100, -100, -100], [-100, 100, -100]], [[-100, 100, -100], [100, 100, -100]], [[100, 100, 100], [100, 100, -100]], [[100, -100, 100], [100, -100, -100]], [[-100, -100, 100], [-100, -100, -100]], [[-100, 100, 100], [-100, 100, -100]]]

#rest of the programme

TLDR:第一个变体在您的数据之间共享引用,第二个则没有。


list 字面量和相等性都不表示与其他数据结构共享元素。具有相同文字或相等的两个对象仍然允许它们具有不同的共享数据。当您修改对象时,这会有所不同:

 >>> a = [[1, 2, 3], [4, 5, 6]]
 >>> # copy by sharing elements
 >>> b = [a[0], a[1]]
 >>> # copy by literal value
 >>> c = eval(repr(a))
 >>> a == b == c
 True
 >>> a[1].append(7)
 >>> a == b  # b shares data with a
 True
 >>> a == c  # c shares no data
 False

在您的情况下,第一个 polygon 与您的其他列表共享其数据。从文字创建的第二个 polygon 仅包含新对象:

# share objects with polygon
for pearJuice in p: polygon.append(pearJuice)
for pearJuice in bob: polygon.append(pearJuice)
for pearJuice in q: polygon.append(pearJuice)
# create new objects for polygon
polygon = [[[100, 100, 100], [100, -100, 100]], [[100, -100, 100], [-100, -100, 100]], [[-100, -100, 100], [-100, 100, 100]], [[-100, 100, 100], [100, 100, 100]], [[100, 100, -100], [100, -100, -100]], [[100, -100, -100], [-100, -100, -100]], [[-100, -100, -100], [-100, 100, -100]], [[-100, 100, -100], [100, 100, -100]], [[100, 100, 100], [100, 100, -100]], [[100, -100, 100], [100, -100, -100]], [[-100, -100, 100], [-100, -100, -100]], [[-100, 100, 100], [-100, 100, -100]]]

如果您需要在程序中分别修改qbobppolygon,记得copy.deepcopy它们。