我正在尝试制作一个直接与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
答案 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))