我创建了一个带有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.]
答案 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.]