首页 > 解决方案 > python错误列表参考

问题描述

你好社区,

        SourcePoints = self.SourcePoints
        TargetPoints = self.TargetPoints

        print("SourcePoints: ", self.SourcePoints)
        print("TargetPoints: ", self.TargetPoints)

        for point in SourcePoints:
            for i in range(len(point)):
                point[i] = Origin[i] + point[i] * Spacing[i]
        for point in TargetPoints:
            for i in range(len(point)):
                point[i] = Origin[i] + point[i] * Spacing[i]

        print("SourcePoints: ", self.SourcePoints)
        print("TargetPoints: ", self.TargetPoints)

您可能需要了解上下文: - self.SourcePoints/self.TargetPoints 在创建类的实例(继承代码)后初始化。没有其他部分可以操作列表。- self.SourcePoints/self.TargetPoints 是列表的列表 - 截断的代码是类中函数的一部分

我到目前为止还不是编程专家,所以我可能会在这里监督一些明显的事情,但我看不到它,这让我发疯,因为两个打印命令没有相同的输出......并且脚本崩溃(ofc)因为self.SourcePoints/self.TargetPoints 在后续迭代中是“错误的”。

所以你现在可以说,写

        SourcePoints = self.SourcePoints

您不制作副本,而是创建对列表的引用,因此在 for 循环期间自然会更改原始列表。对我来说很有意义,这就是我尝试的原因

        SourcePoints = copy.copy(self.SourcePoints)

        SourcePoints = self.SourcePoints.copy()

两者都没有改变任何东西。

然后我对自己说,可能是因为列表名称相同。所以脚本认为如果我在类函数中使用变量“SourcePoints”,我想更改变量 self.SourcePoints。所以我把一切都改成了

        srcPoints = self.SourcePoints.copy()

它仍然不起作用......我真的不知道发生了什么,它让我发疯。幸运的是,我绕过了脚本,但我仍在试图弄清楚为什么会一直发生这种情况。这两个打印命令如何没有相同的输出对我来说完全没有意义。然而,计算机只是在做我告诉他做的事情。

有人可以启发我吗?

问候,空

标签: pythonlist

解决方案


您正在创建实例变量的浅表副本。要获得对象的完全独立副本,您可以使用该copy.deepcopy()函数。

尝试对前 2 行进行以下更改

import copy
SourcePoints = copy.deepcopy(self.SourcePoints)
TargetPoints = copy.deepcopy(self.TargetPoints)

您可能会发现这篇文章有助于了解有关浅层和深层复制的更多信息 - 了解 dict.copy() - 浅层还是深层?


推荐阅读