对象属性

时间:2018-04-20 03:26:45

标签: python

我想制作一个对象属性的临时副本,这样我就可以在不影响对象属性的情况下对其进行操作。我已经尝试了几种方法,但我不确定它为什么不起作用。这里涉及的对象属性是sc.theta,它是一个三维的整数列表。 sc是自定义类Scenario的一个实例。 (本问题末尾包括一个MWE)。

这些是我尝试的几种方式,但它们似乎是"深拷贝"代替。

  1. 制作3D列表的副本

    theta_clone = sc.theta
    theta_clone[0][0][0] = 100
    
    assert theta_clone[0][0][0] == sc.theta[0][0][0]
    
  2. 制作"浅"使用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]
    
  3. 制作"浅"使用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]
    
  4. 您可以使用以下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]
    

0 个答案:

没有答案