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]
  • 相关阅读:
    1026 Table Tennis (30)
    1029 Median
    1025 PAT Ranking (25)
    1017 Queueing at Bank (25)
    1014 Waiting in Line (30)
    1057 Stack (30)
    1010 Radix (25)
    1008 Elevator (20)
    字母大小写转换
    Nmap的基础知识
  • 原文地址:https://www.cnblogs.com/xym4869/p/11126163.html
Copyright © 2011-2022 走看看