python - 不修改调用实例

标签 python object

我正在尝试生成向量的标量积 v1.scalar_product(3)但注意到实例也在发生变化。

    class Vector(object):
        def __init__(self, data = None):
            if data is None:
                self._vector = []
            else:
                self._vector = data[:]

        def __str__(self):
            if self._vector == []:
                return '<>'
            else:
                return ('<'+ str(float(self._vector[0])) + ', ' + str(float(self._vector[1])) + ', ' + str(float(self._vector[2])) + '>')

        def dim(self):
            if self._vector == None:
                return 0
            else:
                return len(self._vector)

        def get(self, index):
            if index > self.dim():
                raise IndexError
            else:
                return float(self._vector[index])

        def set(self, index, value):
            if index > self.dim():
                raise IndexError
            else:
                self._vector[index] = value

        def scalar_product(self, scalar):
            v3 = self
            for i in range(self.dim()):
                v3.set(i, self.get(i) * scalar)
            return v3._vector

    v1 = Vector([1, 2, 3])
    v2 = v1.scalar_product(3)

v2正确返回 [3.0, 6.0, 9.0]但是v1应该保持不变[1, 2, 3]但目前更改为 <3.0, 6.0, 9.0>为什么?

最佳答案

在执行 scalar_product 时,您正在修改您的 v1 实例(因为 v3 = self)。如果您想返回一个新向量而不是修改当前向量,请使用深度复制或新向量创建 v3 的新实例。

    import copy
    def scalar_product(self, scalar):
        # using deep copy
        v3 = copy.deepcopy(self)
        # or using new Vector object and list builtin copy
        v3 = Vector(data=self._vector.copy())
        for i in range(self.dim()):
            v3.set(i, self.get(i) * scalar)
        return v3._vector

关于python - 不修改调用实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59070304/

相关文章:

javascript - 如果 json 属性值重复,则比较其另一个数字属性并设置属性bigerDuplicate

javascript - JavaScript 中的对象没有返回值

python - 如何使用 python "webscrape"包含弹出窗口的网站?

javascript - 映射对象键: value pair to array of object arrays for JSON

python - wx.ProgressDialog 在被销毁时导致段错误和/或 GTK_IS_WINDOW 失败

python - 合并重复的列 Pandas

python - 我怎样才能简单地从现有实例继承方法?

python - 理解Python的 `property`和 `__init__`

Python - Pip 安装 - 代理错误 - 'Cannot connect to proxy.',OSError'

python - 使用 Python 进行 HTTP 请求和响应检查