zoukankan      html  css  js  c++  java
  • 关于python的深拷贝和浅拷贝

    写类函数的时候出了一个错,原代码写在这里:

    def Update(self, wm, vm, ts, pos, vn, att):
            # 上一时刻位置,速度
            pos_pre = pos
         self.pos = pos vn_pre
    = vn
         self.vn = vn
    # vn更新 self.vn = self.vn + self.delta_vn # pos更新 self.pos[0, 0], self.pos[1, 0] = Q2Pos(self.qne) self.pos[2, 0] = self.pos[2, 0] - mid_vn[2, 0] * ts

    这样写的时候,pos_pre会随着self.pos的改变而改变,vn_pre不会随着self.vn改变。

    原因:在开辟空间时,同时将pos_pre和self.pos指向pos,将vn_pre和self.vn指向vn,但在修改vn时,是重建数组,即重新创建了一个数据空间,但在修改pos时,是在原数组空间进行修改。

    举个例子:

    In [2]: a = [1,2,3]
    
    In [3]: def test(a):
       ...:     c = a
       ...:     d = a
       ...:     d = [2,3,4]
       ...:     return c
       ...:
    
    In [4]: test(a)
    Out[4]: [1, 2, 3]
    
    In [6]: def test2(a):
       ...:     c = a
       ...:     d = a
       ...:     d[0] = 5
       ...:     return c
       ...:
    
    In [7]: test2(a)
    Out[7]: [5, 2, 3]

    如果实现空间独立,使用深拷贝,每个数组开辟一个新的空间:

    In [1]: import copy
    
    In [2]: a = [1,2,3]
    
    In [3]: def test3(a):
       ...:     c = copy.deepcopy(a)
       ...:     d = copy.deepcopy(a)
       ...:     d[0] = 5
       ...:     return c
       ...:
    
    In [4]: test3(a)
    Out[4]: [1, 2, 3]
  • 相关阅读:
    ABP 往前端返回详细的错误信息
    ABP 报错1
    three.js 测试1
    three.js 添加 图形控制界面 gui
    three.js 设置透明度
    three.js 基础使用1
    three.js 添加环境光
    three.js 添加三维坐标系
    P2690 接苹果
    [USACO08FEB]修路Making the Grade
  • 原文地址:https://www.cnblogs.com/xym4869/p/11126163.html
Copyright © 2011-2022 走看看