创建python类外元素列表的副本

创建python类外元素列表的副本,python,list,class,deep-copy,Python,List,Class,Deep Copy,我正在编写一个脚本,用于处理有限元分析(FEA)中多个节点的计算应变/变形。对于不同的正输入扭矩,有多种解决方案。我想外推这些数据,并模拟负扭矩的结果。同时,原始数据也会发生变化 由于我们没有直接改变任何原始值,我认为必须通过功能外推FEA通过引用来访问。我一直在尝试copy.deepcopy,但在多个线程中发现这不会复制类结构。但我正在努力适应我的情况 以下代码位于包含对象相同半径上所有节点的类内。所有节点都在一个列表中。_节点按角度排序。每个节点都具有所有扭矩级别的应变 class Radi

我正在编写一个脚本,用于处理有限元分析(FEA)中多个节点的计算应变/变形。对于不同的正输入扭矩,有多种解决方案。我想外推这些数据,并模拟负扭矩的结果。同时,原始数据也会发生变化

由于我们没有直接改变任何原始值,我认为必须通过功能外推FEA通过引用来访问。我一直在尝试
copy.deepcopy
,但在多个线程中发现这不会复制类结构。但我正在努力适应我的情况

以下代码位于包含对象相同半径上所有节点的类内。所有节点都在一个列表中。_节点按角度排序。每个节点都具有所有扭矩级别的应变

class RadialNodeContainer:
    def __init__(self, radius):
        self._r = radius
        self._nodes = []
    def compute_negatives_radial_container(self): # ... see below

class Node:
    def __init__(self, node_id, x, y, z,
                 strain_0nm, strain_100nm, strain_204nm, strain_369nm):
        self._coordinate = Coordinate(x, y, z)
        self._torque_levels = [strain_0nm, strain_100nm,
                               strain_204nm, strain_369nm]
    def get_all_strains_complete(self):
        return copy.deepcopy(self._torque_levels)

class Strain:
    def __init__(self, torque_nm, exx, exy, eyy):
        self._torque = torque_nm
        self._exx = exx
        self._exy = exy
        self._eyy = eyy
导致原始数据发生不必要更改的功能:

def compute_negatives_radial_container(self):
    points_per_360deg = len(self._nodes)
    jj = points_per_360deg
    corresponding_node_strains = None
    for ii in range(points_per_360deg):
        jj -= 1
        # Mistake is expected below here
        corresponding_node_strains = copy.deepcopy(
                         self._nodes[jj].get_all_strains_complete())                      
        for kk in range(len(corresponding_node_strains)):
            torque = corresponding_node_strains[kk].get_torque_level()
            if torque != 0:
                exx, exy, eyy = corresponding_node_strains[kk].get_raw_strains()
                calculated_negative_strain = Strain(torque_nm=-torque,
                                                    exx=exx,
                                                    exy=-exy,
                                                    eyy=eyy)
                self._nodes[ii].add_torque_level(calculated_negative_strain)

我想创建应变元素列表的
deepcopy
Node->self.\u torque\u level
)。最初,此列表类似于
[应变(0Nm)、应变(100Nm),…]
。但是,我不知道为了允许传递类实例的副本,我必须对代码的哪一部分进行调整。

详细说明。如果我有时间的话,我会详细介绍这一点,而这正是OP想要的

我还建议对数组使用numpy而不是列表,因为mumpy要快得多

class Strain:
    def __init__(self, torque_nm, exx, exy, eyy):
        self._torque = torque_nm
        self._exx = exx
        self._exy = exy
        self._eyy = eyy
        self._neg = False

    def setNeg(self, neg):
        self._neg = neg

    @propery
    def torque(self):
        return _torque if not self._neg else -self.torque

    @propery
    def exx(self):
        return _exx

    @propery
    def exy(self):
        return _exy if not self._neg else -self._exy

    @propery
    def eyy(self):
        return _eyy

详细说明。如果我有时间的话,我会详细介绍这一点,而这正是OP想要的

我还建议对数组使用numpy而不是列表,因为mumpy要快得多

class Strain:
    def __init__(self, torque_nm, exx, exy, eyy):
        self._torque = torque_nm
        self._exx = exx
        self._exy = exy
        self._eyy = eyy
        self._neg = False

    def setNeg(self, neg):
        self._neg = neg

    @propery
    def torque(self):
        return _torque if not self._neg else -self.torque

    @propery
    def exx(self):
        return _exx

    @propery
    def exy(self):
        return _exy if not self._neg else -self._exy

    @propery
    def eyy(self):
        return _eyy

你不能简单地添加一个方法来处理负值吗?然后,当以后引用时,请使用类中的开关或其他方法。您不能简单地添加一个方法来处理负值吗?然后,当以后引用时,使用类中的开关或其他方法。谢谢您的建议。负片是对不同位置(在x轴上镜像)的节点应变的外推,不能由同一节点的应变生成。换句话说:我们取
self.\u节点[jj]
-在
self.\u节点[ii]
处的负值。因此,我认为这种方法行不通。谢谢你把我介绍给@property,非常整洁!因此,在数据数组而不是数组点上执行相同的操作。有一个'strain_array'类,让它根据一些开关改变它的输出。创建某个集合类的子类,或在自己的类上使用_iter__;()特殊方法。感谢您的建议。负片是对不同位置(在x轴上镜像)的节点应变的外推,不能由同一节点的应变生成。换句话说:我们取
self.\u节点[jj]
-在
self.\u节点[ii]
处的负值。因此,我认为这种方法行不通。谢谢你把我介绍给@property,非常整洁!因此,在数据数组而不是数组点上执行相同的操作。有一个'strain_array'类,让它根据一些开关改变它的输出。创建某个集合类的子类,或在自己的类上使用_iter__;()特殊方法。