使用类元素创建python列表的副本

时间:2019-04-01 04:29:44

标签: python list class deep-copy

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

由于我们没有直接更改任何原始值,因此我认为必须通过外推FEA的函数通过引用对其进行访问。我一直在尝试jenkins,但是在多个线程中发现这不会复制类结构。在other threads it was recommended to inherit中,但我正在努力使其适应我的情况。

以下代码在该类内部,包含对象同一半径上的所有节点。所有节点都在列表copy.deepcopy中,按其角度排序。每个节点都具有所有扭矩水平的应变。

self._nodes

导致不必要的更改原始数据的功能:

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._torque_level。但是我无法确定我必须修改哪些部分代码才能传递类实例的副本。

1 个答案:

答案 0 :(得分:0)

详细说明。如果有时间,这将是OP所需要的。

我还建议您将numpy用于数组而不是列表,因为脾气暴躁要快得多。

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