前言:

没有前言了- -......这系列是整理的以前的笔记上传的,有些我自己都忘记我当时记笔记的关联关系了。

记住以后 笔记记了就是用来复习的!!!不看不就啥用没了吗!!!

content:

1.python中的对象和变量引用

2.del语句和垃圾回收

3.数据类型的可变性(常因为这个出现的经典错误)

================

1.python中的对象和变量引用

a.python和java中的变量本质完全不一样
  静态语言最开始的时候就分配了一个盒子,盒子里的东西是什么最开始就是定好了的
  python的变量实际上就是一个指针,可以贴在str也可以贴在int上。
  a=1的过程:
    a)先在内存中声明一块int空间,存储1
    b)然后把a贴在1这个空间上
  attention:实际上是先生成对象,然后再将a指向对象
  如果是用java或者c的话,就是把1放在a这个盒子里。
 
b.变量和值的改变  
  所以本质是,a和b都是直接贴在了那个数组的内存空间上,id是一样的。
 
c.==和is的区别
  is:判断是否是同一个对象
  ==:判断值是否相等
  b=一个值的时候,是重新生成了一个对象的。
  但是!!a=1 b=1的时候,id也是相等的。因为python中有个inten机制,对小整数的指向和小段字符串的指向,python有个内部的机制,是不会重新生成对象,而是直接引用已有的对象。
 
 
d.==是怎么判断出来的?
  跟魔法函数有关,用==的时候,用了__eque__魔法函数
 
e.如何去判断类?
  isinstance(person,Person)
  用type判断也可。
  实际上,用type判断的时候 最好不要用== 而是用is

2.del语句和垃圾回收

a.python垃圾回收机制
  python中的垃圾回收 采用的是引用计数
  a=1
  b=1
  那么1的计数器加1
  python的delete的时候,计数器减一
  如果计数器为0了那么这个对象空间会被释放
  这点和c++的不同,c++会直接回收这个对象
 
 
b.如何delete
 
c.垃圾回收的魔法函数
  __del__()
  这个方法里,可以用这个函数来解决我们希望python解释器让这个对象被回收的时候,做的事情。
  当多个引用还在的时候,用del 变量会被回收吗?
  从上面可以看出,当计数器是2的时候,删除了im,还有个x,变量是在程序结束时调用的回收函数。
  最后需要说明的是,如果父类提供了 __del__() 方法,则系统重写 __del__() 方法时必须显式调用父类的 __del__() 方法,这样才能保证合理地回收父类实例的部分属性。

3.数据类型的可变性(常因为这个出现的经典错误)

a.正常相加函数用法:
a传递进来的时候是修改了a  +=其实对list的时候是不一样的
 
b.传递list进去:
此时的a再经过add函数后,已经变了。
 
c.传递tuple进去:
此时的a没有受到影响
 
d.可变对象作为参数的坑:
可以用对象的 __init__.__default__得到
总结:尽量不要传递list参数,要明白它是可以被修改的
正常传递:
 
当没有传递list 而是直接默认的用默认的list空参数的时候
此时company2和company3中的staffs是同一个对象。
正常来说,我们想得到的是两个有不同staffs列表的对象,但是这里的company3里的staffs被修改,company2的也被修改了。不符合我们的最初意图。
这就是我们再可变参数作为传递参数时可能遇到的坑。 
 
ps. 在Python中,数值类型int 、float、 字符串str 、元祖tuple、boole 都是不可变对象
列表list、集合set、字典dict都是可变对象

PythonI/O进阶学习笔记_6.对象引用,可变性和垃圾回收的更多相关文章

  1. 流畅的python 对象引用 可变性和垃圾回收

    对象引用.可变性和垃圾回收 变量不是盒子 人们经常使用“变量是盒子”这样的比喻,但是这有碍于理解面向对象语言中的引用式变量.Python 变量类似于 Java 中的引用式变量,因此最好把它们理解为附加 ...

  2. PythonI/O进阶学习笔记_1.抽象、面向对象、class/object/type

    前言: 是自己在学习python进阶IO学习视频的时候的理解和笔记,因为很多都是本菜鸟学习时候的自己的理解,有可能理解有误. Content: - 抽象的概念和面向对象的概念?想要大概了解python ...

  3. PythonI/O进阶学习笔记_3.2面向对象编程_python的继承(多继承/super/MRO/抽象基类/mixin模式)

    前言: 本篇相关内容分为3篇多态.继承.封装,这篇为第二篇 继承. 本篇内容围绕 python基础教程这段: 在面向对象编程中,术语对象大致意味着一系列数据(属性)以及一套访问和操作这些数据的方法.使 ...

  4. PythonI/O进阶学习笔记_5.python的set和dict

    前言: 我一直觉得对我来说学习知识很忌讳不系统.本篇内容与上一篇 自定义序列类是有联系的. 上一篇比较通范的了解了序列类的一些协议和特性,并且有些list的内容.这篇更加具体到set和dict这两个序 ...

  5. PythonI/O进阶学习笔记_8.python的可迭代对象和迭代器、迭代设计模式

     content: 1.什么是迭代协议 2. 什么是迭代器(Iterator)和可迭代对象(Iterable) 3. 使用迭代器和可迭代对象 4. 创建迭代器和可迭代对象 5. 迭代器设计模式   一 ...

  6. PythonI/O进阶学习笔记_10.python的多线程

     content: 1. python的GIL 2. 多线程编程简单示例 3. 线程间的通信 4. 线程池 5. threadpool Future 源码分析   ================== ...

  7. PythonI/O进阶学习笔记_3.1面向对象编程_python的多态和鸭子类型

    前言: 与第一篇的面向对象内容不同的是,第一篇中的面向对象更多的是与类.对象结合起来的概念粗浅理解,就是在编程历史中诞生的一种思想方法. 这篇的面向对象编程,更多落实到在语言设计实现中,是如何体现面向 ...

  8. PythonI/O进阶学习笔记_2.魔法函数

    前言: 本文一切观点和测试代码是在python3的基础上. Content: 1.什么是魔法函数,魔法函数__getitem__在python中应用. 2.python的数据模型和数据模型这种设计对p ...

  9. PythonI/O进阶学习笔记_3.2面向对象编程_python的封装

    前言: 本篇相关内容分为3篇多态.继承.封装,这篇为第三篇 封装. 本篇内容围绕 python基础教程这段: 在面向对象编程中,术语对象大致意味着一系列数据(属性)以及一套访问和操作这些数据的方法.使 ...

随机推荐

  1. LeetCode_62_不同路径

    /** * @author jianw.li * @date 2019/1/22 11:11 PM * @Description: 不同路径 * 一个机器人位于一个 m x n 网格的左上角 (起始点 ...

  2. Mybatis案例超详解(上)

    Mybatis案例超详解(上) 前言: 本来是想像之前一样继续跟新Mybatis,但由于种种原因,迟迟没有更新,快开学了,学了一个暑假,博客也更新了不少,我觉得我得缓缓,先整合一些案例练练,等我再成熟 ...

  3. HTML文件上传与下载

    文件下载 传统的文件下载有两种方法: 使用<a/>标签,href属性直接连接到服务器的文件路径 window.location.href="url" 这两种方法效果一样 ...

  4. Swift项目引入第三方库的方法

    以下,将创建一个Swift项目,然后引入3个库: Snappy 简化autolayout代码的库 Alamofire HTTP网络库,AFNetworking作者写的 SDWebImage 图片加载, ...

  5. Unity进阶之ET网络游戏开发框架 03-Hotfix层启动

    版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...

  6. net core Webapi基础工程搭建(七)——小试AOP及常规测试_Part 2

    目录 前言 引入 自定义属性 测试 小结 前言 前一篇讲到了中间层的使用,可能不是那么AOP,今天主要来说下一个轻量级的AOP第三方类库AspectoCore. 简单介绍下这个类库,AspectCor ...

  7. Nginx总结(一)Linux如何安装Nginx

    以前写过一些Nginx的文章,但都是用到什么说什么,没有一个完整系统的总结.趁最近有时间,打算将Nginx相关的内容重新整理一下.nginx系列文章地址如下:https://www.cnblogs.c ...

  8. 基础部分之System、Object、Calendar、StringBuffer

    System.out.println(obj)和 System.out.println(obj.toString())区别 public static void main(String[] args) ...

  9. 一文搞懂Python中的所有数组数据类型

    关于我 一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android.Python.Java和Go,这个也是我们团队的主要技术栈. Github:https:/ ...

  10. 做「容量预估」可没有true和false

    如果第二次看到我的文章,欢迎右侧扫码订阅我哟~