3.9 内存相关

3.9.1 id,查看内存地址

  1. >>> v1 = [11,22,33]
  2. >>> v2 = [11,22,33]
  3. >>> print(id(v1),id(v2)) # 比较两个变量的内存值
  4. 4472652360 4473773640
  5. # 对于 -5 ~ 256 的整数来说会有小地址池的概念,不会创建新的内存地址
  1. >>> v1 = "我,你,他,它,她"
  2. >>> v2 = "我,你,他,它,她"
  3. >>> print(id(v1),id(v2))
  4. 4473666128 4473665840
  1. # 赋值,就是把v2指向了v1的内存地址,所以他们的内存地址一样
  2. >>> v1 = "我,你,他,它,她"
  3. >>> v2 = v1
  4. >>> print(id(v1),id(v2))
  5. 4473666128 4473666128
  6. # 重新赋值,v1的内存地址变了,但是v2的内存地址没变
  7. >>> v1 = "我,你,他,它,她"
  8. >>> v2 = v1
  9. >>> v1 = "我,你,他,它,她,天" v1现在指向"我,你,他,它,她,天"的地址,v2还是原来的
  10. >>> print(id(v1),id(v2))
  11. 4473665840 4473666128
  12. >>> print(v2)
  13. 我,你,他,它,她

is,比较内存地址

  1. >>> v1 = {'k1':'v1','k2':[1,2,3]}
  2. >>> v2 = {'k1':'v1','k2':[1,2,3]}
  3. >>> result1 = v1 == v2
  4. >>> result2 = v1 is v2
  5. >>> print(result1)
  6. True
  7. >>> print(result2)
  8. False

重要

is 和 == 的区别?

== 用于比较值是否相等。

is 用于比较内存地址是否相等。

PS:找到内存地址并在其中做操作和赋值 不一样

重新赋值是重新开辟一块内存空间、可变数据类型

  1. #练习1(内部修改)
  2. v1=[11,22,33]
  3. v2=v1
  4. v1.append(666)
  5. print(v2) #含有666
  6. #练习2(赋值)
  7. v1=[11,22,33]
  8. v2=v1
  9. v1=[1,2,3,4] #此时v1重新赋值为[1,2,3,4],v1=[11,22,33] 对应的内存地址被回收,只要有指向这个内存地址的,就不会被回收
  10. print(v2) #[11,22,33]
  11. #练习3(重新赋值)
  12. v1='alex'
  13. v2=v1
  14. v1='old boy'
  15. print(v2) #'alex'
  16. 总结:可变数据类型列表/字典/集合 有内部修改和赋值
  17. 字符串等不可变的 只有重新赋值(不可在内部修改)
  18. ps:
  19. v=[1,2,3]
  20. value=[11,22,v]
  21. value[2]=666 #对value自己更改,v不会改变
  22. print(v) #[1, 2, 3]
  23. v=[1,2,3]
  24. value=[11,22,v]
  25. value[2][0]=666 #对v里面修改,v会改变
  26. print(v) #[666, 2, 3]

python中有小数据池--缓存机制,节省内存

  1. 数字 (-5-256)
  2. 简单的字符串 ‘ALEX’
  1. a=1
  2. b=1
  3. print(id(a),id(b)) #496846480 496846480 #理论上赋值,是重新开辟内存地址,但python中有缓存机制

3.10 深浅拷贝

浅拷贝:只拷贝第一层。浅copy会仅复制dict的第一层数据,更深层的scores下面的值依然是共享一份

深拷贝:拷贝所有数据(只针对可变数据类型)--- 重新拷贝意味着重新在内存中开辟一块空间,都是独立的内存地址

只有一层的深拷贝意义不大,重要的是对于嵌套

  1. 1int+str+bool/tuple 深浅拷贝是一样的(不可变数据类型,类似小数据池的概念)
  2. v1='alex'
  3. v2=copy.copy(v1)
  4. v3=copy.deepcopy(v1)
  5. print(id(v1),id(v3)) #11611168 11611168
  1. 2list+set+dict (可变数据类型)
  2. 深浅拷贝不一样的

总结

  1. 浅拷贝:仅会拷贝a的框架的内存地址, 里面的任何子元素的内存地址都不会被拷贝.
  2. 深拷贝:不仅拷贝a的框架,而且会拷贝a里所有的可变元素的内存地址,注意不可变元素仍不可拷贝

python内存相关以及深浅拷贝讲解的更多相关文章

  1. Python内存相关

    Python内存相关 示例一: v1 = [1, 2, 3] v2 = [1, 2 ,3] v1 = 123 v2 = 123 v1 = "dogfa" v2 = "do ...

  2. python学习笔记:深浅拷贝的使用和原理

    在理解深浅拷贝之前,我们先熟悉下变量对象和数据类型 1.变量和对象 变量-引用-对象(可变对象,不可变对象) 在python中一切都是对象,比如[1,2],'hello world',123,{'k1 ...

  3. python之路(三)-深浅拷贝

    深浅拷贝用法来自copy模块. 导入模块:import copy 浅拷贝:copy.copy 深拷贝:deepcopy 字面理解:浅拷贝指仅仅拷贝数据集合的第一层数据,深拷贝指拷贝数据集合的所有层.所 ...

  4. python变量存储和深浅拷贝

    python的变量及其存储 在高级语言中,变量是对内存及其地址的抽象.对于python而言,python的一切变量都是对象,变量的存储,采用了引用语义的方式,存储的只是一个变量的值所在的内存地址,而不 ...

  5. Python collection模块与深浅拷贝

    collection模块是对Python的通用内置容器:字典.列表.元组和集合的扩展,它包含一些专业的容器数据类型: Counter(计数器):dict子类,用于计算可哈希性对象的个数. Ordere ...

  6. Python基础入门知识点——深浅拷贝

    深浅拷贝 对象引用.浅拷贝.深拷贝(拓展.难点.重点) Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果 其实这个是由于共享内存导致的结果 拷贝 ...

  7. C++/C#中堆栈、对象内存模型、深浅拷贝、Array.Clone方法

    转载自:http://blog.csdn.net/jarvischu/article/details/6425534 目录 1.      C++/C#中对象内存模型................. ...

  8. 从零开始的Python学习Episode 8——深浅拷贝

    深浅拷贝 一.浅拷贝 列表中存储的是数据的内存地址,当我们要查询或修改列表中的数据时,我们是通过列表中的地址找到要访问的内存.当我们修改列表中的数据时,如果修改的是一个不可变类型(整型,长整型,浮点数 ...

  9. python神坑系列之深浅拷贝

    深浅拷贝 1.注意在拷贝中只有使用了.deepcopy方法才能进行深度拷贝!其余的一律是浅拷贝 #深拷贝import copy lst = copy.deepcopy(lst1)  浅拷贝: 拷贝的是 ...

随机推荐

  1. 【Qt开发】QTextEdit 外观属性设置

    一.给QTextEdit添加背景图片,有下面两种方法: QTextEdit* iEdit  = new QTextEdit(); 1:使用样式表: iEdit->setStyleSheet(&q ...

  2. Websocket --(2)实现

    首先声明,本篇博文参考文章 https://blog.csdn.net/jack_eusong/article/details/79064081 主要在于理解和自己动手搭建环境,自己搭建的过程中会发生 ...

  3. 小记---------linux远程连接集群内其他机器mysql库

    mysql -h -u maxwell -p#10.0.15.145 远程机器ip#-P 注意是大写P 端口#-u 用户#-p 密码

  4. 写 JSP 的痛点,真的非常痛!

    一.前戏 前后端分离已成为互联网项目开发的业界标准使用方式,通过nginx+tomcat的方式(也可以中间加一个nodejs)有效的进行解耦,并且前后端分离会为以后的大型分布式架构.弹性计算架构.微服 ...

  5. C++ day01 预备知识、C++综述、教材、推荐阅读。

    C++ day01: 1.预备知识? 1)什么是编程 编程,即编订程序. 程序 = 数据 + 算法(蛋糕 = 糖.鸡蛋.奶油 + 打鸡蛋.加糖.烤) 2)编程语言 最初的编程是用二进制代码(即“机器码 ...

  6. 初步学习jquery学习笔记(六)

    jquery学习笔记六 AJAX 简介 AJAX 是与服务器交换数据的技术,它在不重载全部页面的情况下,实现了对部分网页的更新. load() 方法 load() 方法从服务器加载数据,并把返回的数据 ...

  7. 實現QQ第三方登錄

    <?php // 写几个函数,分别用于获取code,token,openid,用户信息 // 跳转到QQ授权登录页面 function code(){ $response_type='code' ...

  8. python requests的content和text方法的区别【转】

    requests对象的get和post方法都会返回一个Response对象,这个对象里面存的是服务器返回的所有信息,包括响应头,响应状态码等.其中返回的网页部分会存在.content和.text两个对 ...

  9. 严重报错: Error configuring application listener of class org.springframework.web.context.ContextLoaderLis

    其实可能是你的jar文件没有同步发布到自己项目的lib目录中(如果你是用Maven进行构建的话) 可以试试 下面的办法 项目点击右键 点击 Properties 选择Deployment Assemb ...

  10. 一遍记住 8 种排序算法与 Java 代码实现

    ☞ 程序员进阶必备资源免费送「21种技术方向!」 ☜ 作者:KaelQ, www.jianshu.com/p/5e171281a387 1.直接插入排序 经常碰到这样一类排序问题:把新的数据插入到已经 ...