Python中的对象初始化

时间:2017-10-06 11:46:15

标签: python class object initialization

我创建了一个带有init值 x0 的对象的简单类。当我更改另一个值 x 时,我的 x0 也在变化。

我认为 x0 应保持不变。你能解释一下为什么会这样吗?

档案main.py:

import numpy as np
from simpleclass import test


def main():

    params = dict()
    params['position'] = np.array([1.0, 2.0])

    object = test(params)

    print(object.x0)
    print(object.x)

    object.run(2)

    print(object.x0)
    print(object.x)


if __name__ == "__main__":
    main()

文件 simpleclass.py:

class test():

    def __init__(self, params):
        self.x0 = params['position']
        self.x = self.x0

    def run(self, num):
        self.x += self.x*num

结果:

[ 1.  2.]
[ 1.  2.]
[ 3.  6.]
[ 3.  6.]

3 个答案:

答案 0 :(得分:3)

问题在于

class test():
    def __init__(self, params):
        self.x0 = params['position']
        self.x = self.x0

    def run(self, num):
        self.x += self.x*num

self.x = self.x0这里self.x和self.x0指向同一个对象。你可以复制self.x0。

import copy

class test():
    def __init__(self, params):
        self.x0 = params['position']
        self.x = copy.deepcopy(self.x0)

    def run(self, num):
        self.x += self.x*num

答案 1 :(得分:1)

surya singh是对的,只需打印内存地址,你就会得到相同的数字

class test():
    def __init__(self, params):
        self.x0 = params['position']
        self.x = self.x0
        print id(self.x)
        print id(self.x0)

答案 2 :(得分:1)

您只传递参考

self.x = self.x0,您只传递参考。使用self.x += self.x*num时,引用也不会更改。因此,在这两个操作之后, x x0 仍然指向同一个数组。

如果您使用不可变对象,例如元组

,情况会有所不同
params['position'] = (1, 2)

使用元组+=会做出与您想要的不同的事情,但是您会看到, x x0 指向不同的对象

(1, 2)
(1, 2)
(1, 2)
(1, 2, 1, 2, 1, 2)

使用副本

你想创建一个数组的副本,numpy有一个built-in method

self.x = self.x0.copy()

结果:

[ 1.  2.]
[ 1.  2.]
[ 1.  2.]
[ 3.  6.]