1

我正在尝试制作与 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 是一个矢量对象。)

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

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

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

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

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

4

1 回答 1

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))
于 2013-08-14T18:45:44.143 回答