Python中的对象初始化
我用对象创建了一个简单的类,该对象具有init valuex0。当我更改另一个值x时,我的x0也在更改 我认为x0应该保持不变。你能解释一下为什么会这样吗 文件main.py: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)
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.]
谢谢我会记住的谢谢!我会记住这一点