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

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]

关于python的深拷贝和浅拷贝的更多相关文章

  1. python 中 深拷贝和浅拷贝的理解

    在总结 python 对象和引用的时候,想到其实 对于python的深拷贝和浅拷贝也可以很好对其的进行理解. 在python中,对象的赋值的其实就是对象的引用.也就是说,当创建一个对象,然后赋给另外一 ...

  2. [py]python的深拷贝和浅拷贝

    Python深复制浅复制or深拷贝浅拷贝 简单点说 copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象. copy.deepcopy 深拷贝 拷贝对象及其子对象 用一个简单的例子说明 ...

  3. Python中深拷贝与浅拷贝的区别

    转自:http://blog.csdn.net/u014745194/article/details/70271868 定义: 在Python中对象的赋值其实就是对象的引用.当创建一个对象,把它赋值给 ...

  4. python中深拷贝与浅拷贝

    # 1.浅拷贝(复制东西)a = [11,22,33] # 实际上是浅拷贝# 没有把这个变量的值赋进去,而是把另一个变量的地址拿过去了,就叫浅拷贝.b = a # print(id(a))# prin ...

  5. python之深拷贝和浅拷贝

    1.当拷贝的是不可变数据类型(数值.字符串.元组),不管是深拷贝和浅拷贝,都指向的是同一地址: 2.当拷贝的对象是可变数据类型(列表.字典): (1)当浅拷贝的对象中无复杂子对象,原来值的改变不会影响 ...

  6. python中深拷贝和浅拷贝

    python中所谓浅拷贝就是对引用的拷贝,所谓深拷贝就是对对象的资源的拷贝. 首先,对赋值操作我们要有以下认识: 赋值是将一个对象的地址赋值给一个变量,让变量指向该地址( 旧瓶装旧酒 ). 修改不可变 ...

  7. python 中深拷贝和浅拷贝的区别

    通俗的理解,浅就是外面,深就是里面.浅拷贝的意思就是只拷贝外面的一层,深拷贝就是拷贝的里面的所有. 看两段代码: 元组: #!/usr/bin/env/python # -*-coding:utf-8 ...

  8. 关于Python中深拷贝与浅拷贝的理解(一)---概念

    import copy a = [1, 2, 3, 4, ['a', 'b']] #原始对象 b = a #赋值,传对象的引用 c = copy.copy(a) #对象拷贝,浅拷贝 d = copy. ...

  9. Python中深拷贝与浅拷贝区别

    浅拷贝, list值是可变的,str值不可变,只能重新赋值 a=b=c='wjx'print(a,b,c)c= 'jmy'#重新赋值了,所以内存分配了新的地址print(a,b,c)print(id( ...

  10. Python的深拷贝、浅拷贝

    浅拷贝 定义:浅拷贝只是对另外一个变量的内存地址的拷贝,这两个变量指向同一个内存地址的变量值. 浅拷贝的特点: 公用一个值: 这两个变量的内存地址一样: 对其中一个变量的值改变,另外一个变量的值也会改 ...

随机推荐

  1. Matlab外观模式

    外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.本文以计算机为例,用Matlab代码实现外观模式.计算机包括CPU.内存以及硬盘等这些部件.用户 ...

  2. localStorage的增删改查

    var _localStorage = window.localStorage; undefined /* 增 */ _localStorage.name = '张泰松' "张泰松" ...

  3. Flink入门 - CoGroup和Join

    /* *CoGroup */ final StreamExecutionEnvironment streamExecutionEnvironment = StreamExecutionEnvironm ...

  4. Java读书笔记

    一.背景 工作中越来越发现对基础理解的重要性,所谓基础不牢,地动山摇.所以抽了点时间看看几本Java体系的电子书,并做笔记,如下: 二.近期要看的电子书 1.Spring实战(第4版) 2.Sprin ...

  5. [LeetCode] 647. 回文子串 ☆☆☆(最长子串、动态规划、中心扩展算法)

    描述 给定一个字符串,你的任务是计算这个字符串中有多少个回文子串. 具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被计为是不同的子串. 示例 1: 输入: "abc" ...

  6. plsql连接数据库后备注乱码|plsql连接数据库后中文乱码

    -- 背景:连接开发库后查阅单表备注信息时发现所有的备注都显示为"???????". -- 解决方案: -- (1). 首先先确认数据库的编码格式字符集,查询数据库编码格式. -- ...

  7. [应用层]Linux进程间通信机制

    转自:https://www.cnblogs.com/yangang92/p/5679641.html 主要如下方式: 1. 管道pipe2. 命名管道FIFO3. 内存映射MemoryMapping ...

  8. 【HICP Gauss】数据库 数据库管理(文件 用户管理 系统权限 对象权限 profile)-7

    数据库运行 依赖不同类型的文件 ,数据文件 参数文件 控制文件 redo日志文件 运行日志文件 审计日志文件等 数据文件 就是表空间文件 存储数据库的数据文件 参数文件 用户修改的配置信息 控制文件 ...

  9. PCB Layout设计规范——PCB布线与布局

    1.PCB布线与布局隔离准则:强弱电流隔离.大小电压隔离,高低频率隔离.输入输出隔离,分界标准为相差一个数量级.隔离方法包括:空间远离.地线隔开.     2. 晶振要尽量靠近IC,且布线要较粗   ...

  10. OpenStack云计算简介

    1. 云计算的发展 云计算是IT技术不断发展的产物. 要理解云计算,需要对IT系统架构的发展过程有所认识. IT系统架构的发展到目前为止大致可以分为3个阶段: 1> 物理机架构 这一阶段,应用部 ...