Python中的对象初始化

Python中的对象初始化,python,class,object,initialization,Python,Class,Object,Initialization,我用对象创建了一个简单的类,该对象具有init valuex0。当我更改另一个值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)

我用对象创建了一个简单的类,该对象具有init valuex0。当我更改另一个值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()
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.]
文件simpleclass.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()
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.]
结果:

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()
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.]
问题在于

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
问题在于

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

苏里亚·辛格是对的,只要打印内存地址,你就会得到相同的数字

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

苏里亚·辛格是对的,只要打印内存地址,你就会得到相同的数字

class test():
    def __init__(self, params):
        self.x0 = params['position']
        self.x = self.x0
        print id(self.x)
        print id(self.x0)
您只传递了一个引用 通过
self.x=self.x0
,您只传递了一个引用。对于
self.x+=self.x*num
,引用也保持不变。所以在这两个操作之后,x和x0仍然指向同一个数组

如果使用不可变对象(如tuple),则情况会有所不同

对于tuple,
+=
执行的操作与您想要的不同,但是您可以看到,x和x0指向不同的对象

(1, 2)
(1, 2)
(1, 2)
(1, 2, 1, 2, 1, 2)
使用副本 如果要创建数组的副本,numpy有一个

结果:

[ 1.  2.]
[ 1.  2.]
[ 1.  2.]
[ 3.  6.]
您只传递了一个引用 通过
self.x=self.x0
,您只传递了一个引用。对于
self.x+=self.x*num
,引用也保持不变。所以在这两个操作之后,x和x0仍然指向同一个数组

如果使用不可变对象(如tuple),则情况会有所不同

对于tuple,
+=
执行的操作与您想要的不同,但是您可以看到,x和x0指向不同的对象

(1, 2)
(1, 2)
(1, 2)
(1, 2, 1, 2, 1, 2)
使用副本 如果要创建数组的副本,numpy有一个

结果:

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

谢谢我会记住的谢谢!我会记住这一点