Python中的赋值、深拷贝与浅拷贝(内存地址)

1、python中的可变对象与不可变对象

(1) 可变对象:dict,list

  1. def dict_test():
  2. a = {}
  3. b = a
  4. print(id(a)) # 140367329543360
  5. a['a'] = 'hhhh'
  6. print('id a:' + str(id(a))) # id a:140367329543360
  7. print('a:' + str(a)) # a:{'a': 'hhhh'}
  8. print('id b:' + str(id(b))) # id b:140367329543360
  9. print('b:' + str(b)) # b:{'a': 'hhhh'}
  10.  
  11. if __name__ == '__main__':
  12. dict_test()

内存变化如下:

(2) 不可变对象:int,string,float,tuple

  1. def int_test():
  2. i = 77
  3. j = 77
  4. print(id(77)) #
  5. print('i id:' + str(id(i))) #i id:140396579590760
  6. print('j id:' + str(id(j))) #j id:140396579590760
  7. print i is j #True
  8. j = j + 1
  9. print('new i id:' + str(id(i))) #new i id:140396579590760
  10. print('new j id:' + str(id(j))) #new j id:140396579590736
  11. print i is j #False
  12.  
  13. if __name__ == '__main__':
  14. int_test()

内存分配如下:

2、赋值、浅拷贝与深拷贝:

(1) b = a: 赋值引用,a 和 b 都指向同一个对象。

 (2) b = a.copy(): 浅拷贝, a 和 b 是一个独立的对象,但他们的子对象还是指向统一对象(是引用)。

    (3) b = copy.deepcopy(a): 深度拷贝, a 和 b 完全拷贝了父对象及其子对象,两者是完全独立的。

3、更多实例:

  1. #!/usr/bin/python
  2. # -*-coding:utf-8 -*-
  3.  
  4. import copy
  5. a = [1, 2, 3, 4, ['a', 'b']] #原始对象
  6.  
  7. b = a #赋值,传对象的引用
  8. c = copy.copy(a) #对象拷贝,浅拷贝
  9. d = copy.deepcopy(a) #对象拷贝,深拷贝
  10.  
  11. a.append(5) #修改对象a
  12. a[4].append('c') #修改对象a中的['a', 'b']数组对象
  13.  
  14. print( 'a = ', a )
  15. print( 'b = ', b )
  16. print( 'c = ', c )
  17. print( 'd = ', d )

运行结果如下:

  1. ('a = ', [1, 2, 3, 4, ['a', 'b', 'c'], 5])
  2. ('b = ', [1, 2, 3, 4, ['a', 'b', 'c'], 5])
  3. ('c = ', [1, 2, 3, 4, ['a', 'b', 'c']])
  4. ('d = ', [1, 2, 3, 4, ['a', 'b']])

4、按照具体需求选择合适的赋值或者拷贝形式:

 建议:在内存足够的情况下,选择深拷贝,这样逻辑处理独立,不会产生上下文的影响,不容易发生难以解决的bug。

Python中的赋值、深拷贝与浅拷贝(内存地址)的更多相关文章

  1. Python中复制、深拷贝和浅拷贝的区别

    深拷贝定义(deepcopy) 在Python中,由于一切皆对象,所以任何变量都可以被引用,也即可以被赋值给任何变量.但是在Python中,给变量赋值,是区分的,一般情况下,Python中的变量赋值都 ...

  2. 【Python】直接赋值,深拷贝和浅拷贝

    直接赋值: 对象的引用,也就是给对象起别名 浅拷贝: 拷贝父对象,但是不会拷贝对象的内部的子对象. 深拷贝: 拷贝父对象. 以及其内部的子对象 在之前的文章中,提到可变对象和不可变对象,接下来也是以这 ...

  3. Python中查看变量的类型,内存地址,所占字节的大小

    查看变量的类型 #利用内置type()函数 >>> nfc=["Packers","49"] >>> afc=[" ...

  4. Python中的赋值(复制)、浅拷贝、深拷贝之间的区别

    1.赋值: 只是复制了新对象的引用,不会开辟新的内存空间.  2.浅拷贝: 创建新对象,其内容是原对象的引用.    浅拷贝有三种形式:切片操作,工厂函数,copy模块中的copy函数.    如: ...

  5. python中的赋值与拷贝(浅拷贝与深拷贝)

    1.赋值与拷贝 直接赋值(b=a)是传引用,b改动a也会改动. a = [1, 2, 3, 4] b = a b[1] = 999 print(a, b) #[1, 999, 3, 4] [1, 99 ...

  6. Python中什么是深拷贝和浅拷贝且有什么区别

    浅拷贝: >>> a = [1, 2, 3] >>> b = a >>> a [1, 2, 3] >>> b [1, 2, 3] ...

  7. python 中list的深拷贝和浅拷贝

    注意:这里提到是list的隐式转换例如 a=[1,2,3]def test(n):n[2] = n[2]*2c=a此时是浅拷贝,当调用test(c)时,可以看到a也发生了变化c=[1,4,3]a=[1 ...

  8. 【转】Python中的赋值、浅拷贝、深拷贝介绍

    这篇文章主要介绍了Python中的赋值.浅拷贝.深拷贝介绍,Python中也分为简单赋值.浅拷贝.深拷贝这几种"拷贝"方式,需要的朋友可以参考下   和很多语言一样,Python中 ...

  9. python中的“赋值与深浅拷贝”

    Python中,赋值与拷贝(深/浅拷贝)之间是有差异的,这主要源于数据在内存中的存放问题,本文将对此加以探讨. 1 赋值(添加名字) 赋值不会改变内存中数据存放状态,比如在内存中存在一个名为data的 ...

随机推荐

  1. mysql执行操作时卡死

    有时候使用Navicat对mysql数据库进行添加字段,truncate或其他操作时会一直卡住不动,后来查看进程才发现一直处于等待状态 先执行,列出所有进程 show full processlist ...

  2. PHP 构造函数

    在PHP5以前的版本中,构造函数的名称必须与类名相同,这种方法在PHP5中仍然可以使用,但现在已经很少有人用了.PHP5以及之后的版本,构造函数用__construct()方法来声明,这样做的好处是可 ...

  3. Saiku使用iframe嵌入页面访问地址配置化(二十八)--DWR的基本使用

    Saiku使用iframe嵌入页面使用时ip与端口配置化(二十八)--DWR的基本使用 DWR(Direct Web Remoting)是一个用于改善web页面与Java类交互的远程服务器端Ajax开 ...

  4. javascript 模块化 (切记:学习思想)

    模块化(切记:学习思想) 如果不用模块化编写代码,那么会具有以下问题: 代码杂乱无章,没有条理性,不便于维护,不便于复用 很多代码重复.逻辑重复 全局变量污染 不方便保护私有数据(闭包) 模块化的基本 ...

  5. swoole中使用task进程异步的处理耗时任务

    我们知道,swoole中有两大进程,分别是 master 主进程和 manager 管理进程. 其中 master 主进程中会有一个主 reactor 线程和多个 reactor 线程,主要的作用就是 ...

  6. python 安装impala包

    一路安装就可以 .pip install six .pip install bit_array .pip install thriftpy .pip install thrift_sasl .pip ...

  7. 教你如何用Python向手机发送通知

    ------------恢复内容开始------------ 你曾想尝试在服务器端或电脑上向手机发送通知吗? 你曾烦恼过企业邮箱的防骚扰机制吗? 现在,我们可以用一种简单轻松的方法来代替企业邮箱了! ...

  8. django接口文档自动生成

    django-rest_framework接口文档自动生成 只针对用到序列化和返序列化 一般还是用第三方yipi 一.安装依赖 pip3 install coreapi 二.设置 setting.py ...

  9. react网页版聊天|仿微信、微博web版|react+pc端仿微信实例

    一.项目介绍 基于react+react-dom+react-router-dom+redux+react-redux+webpack2.0+nodejs等技术混合开发的仿微信web端聊天室react ...

  10. Vue实战狗尾草博客管理平台第五章

    本章主要内容如下: 静态资源服务器的配置.学会如何使用静态资源服务器引入静态资源.并给大家推荐一个免费可使用的oss服务器~ 页面的开发由于近期做出的更改较大.就放在下一篇中. 静态资源服务器 静态资 ...