我想制作一个对象属性的临时副本,这样我就可以在不影响对象属性的情况下对其进行操作。我已经尝试了几种方法,但我不确定它为什么不起作用。这里涉及的对象属性是sc.theta
,它是一个三维的整数列表。 sc
是自定义类Scenario
的一个实例。 (本问题末尾包括一个MWE)。
这些是我尝试的几种方式,但它们似乎是"深拷贝"代替。
制作3D列表的副本
theta_clone = sc.theta
theta_clone[0][0][0] = 100
assert theta_clone[0][0][0] == sc.theta[0][0][0]
制作"浅"使用copy.copy()
theta_clone = copy.copy(sc.theta)
theta_clone[0][0][0] = 100
assert theta_clone[0][0][0] = sc.theta[0][0][0]
制作"浅"使用copy.copy()
sc_clone = copy.copy(sc.theta)
sc_clone.theta[0][0][0] = 100
assert sc_clone.theta[0][0][0] == sc.theta[0][0][0]
您可以使用以下MWE重现这一点:
from copy import copy
class Scenario:
def __init__(self):
self.theta = [[[4, 5, 6, 5, 4], [4, 5, 6, 5, 4], [4, 5, 6, 5, 4]]]
sc = Scenario()
# Method 1
theta_clone = sc.theta
theta_clone[0][0][0] = 100
assert theta_clone[0][0][0] == sc.theta[0][0][0]
# Method 2
theta_clone = copy(sc.theta)
theta_clone[0][0][0] = 100
assert theta_clone[0][0][0] == sc.theta[0][0][0]
# Method 3
sc_clone = copy(sc)
sc_clone.theta[0][0][0] = 100
assert sc_clone.theta[0][0][0] == sc.theta[0][0][0]