修改列表中的一个对象会修改列表中的所有对象

时间:2013-08-14 18:40:22

标签: python list object vector

我正在尝试制作一个直接与3d网格中任何给定点相邻的坐标列表。 例如,当给定向量{3,3,3}时,该函数应返回以下列表:

[{4,3,3},{2,3,3},{3,4,3},{3,2,3},{3,3,4},{3,3,2}]

(花括号中的值是矢量对象,而不是列表。) 这是我的代码:

def touchingBlocks(sourceBlock):
    touching = []
    for t in range(6):
        touching.append(sourceBlock)
    touching[0].x += 1
    touching[1].x -= 1
    touching[2].y += 1
    touching[3].y -= 1
    touching[4].z += 1
    touching[5].z -= 1
    return touching

(sourceBlock是一个矢量对象。)

当我尝试修改列表中的任何一个对象时,它会修改每个对象。例如,在触摸[0] .x + = 1命令后,我希望触摸等于:

[{4,3,3},{3,3,3},{3,3,3},{3,3,3},{3,3,3},{3,3,3}]

(假设我们给了函数vector {3,3,3}) 相反,每个对象的'x'值都改变了,而不仅仅是第一个。在函数结束时,此错误导致只返回原始向量的六个副本的列表。

我认为这可能是因为列表中的对象只是指向同一版本的sourceBlock的指针,但我不确定。你能否确认我是否正确以及如何解决这个问题?

此外,这里是矢量对象的链接,以防你需要查看: https://www.dropbox.com/s/zpuo6473z225la7/vec3.py

1 个答案:

答案 0 :(得分:2)

def touchingBlocks(sourceBlock):
    touching = []
    for t in range(6):
        touching.append(sourceBlock)  # Here is your error
    touching[0].x += 1
    touching[1].x -= 1
    touching[2].y += 1
    touching[3].y -= 1
    touching[4].z += 1
    touching[5].z -= 1
    return touching

您要添加相同的对象6次。每次编辑一个对象时,都要进行编辑 商场。您应该使用copy.depcopy创建对象的副本 (deepcopy也将复制嵌套对象,而不仅仅是它们的引用)

import copy
[...code...]
touching.append(copy.deepcopy(sourceBlock))