前言:

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

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

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. linux之压缩和解压

    归档:也称为打包,指的是一个文件或目录的集合,而这个集合被存储在一个文件中.归档文件没有经过压缩,因此,它占用的空间是其中所有文件和目录的总和.压缩:压缩文件也是一个文件和目录的集合,且这个集合也被存 ...

  2. lumen 路由访问路径

    项目目录/public/index.php/接你设置的路由 比如设置了 $app->get('/test', function () use ($app) {    return $app-&g ...

  3. Unity进阶之ET网络游戏开发框架 02-ET的客户端启动流程分析

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

  4. F#周报2019年第33期

    新闻 宣告.NET Core 3.0预览版8 新的fable.io站点伴随着更多文档发布 正在努力使你的团队相信F#的益处?Compositional IT能够提供帮助 提名2019年度F#社区英雄 ...

  5. 彻底搞懂Java中equals和==的区别

    java当中的数据类型和“==”的含义: 1.基本数据类型(也称原始数据类型) :byte,short,char,int,long,float,double,boolean.他们之间的比较,应用双等号 ...

  6. nessus安装

    1.安装注册 (1)从https://www.tenable.com/products/nessus/select-your-operating-system上下载对应操作系统版本的nessus,结果 ...

  7. Leetcode solution 124: Binary Tree Maximum Path Sum

    Problem Statement Given a non-empty binary tree, find the maximum path sum. For this problem, a path ...

  8. SpringBoot:处理跨域请求

    一.跨域背景 1.1 何为跨域? Url的一般格式: 协议 + 域名(子域名 + 主域名) + 端口号 + 资源地址 示例: https://www.dustyblog.cn:8080/say/Hel ...

  9. C# - 协变、逆变 看完这篇就懂了

    1. 基本概念 官方:协变和逆变都是术语,前者指能够使用比原始指定的派生类型的派生程度更大(更具体的)的类型,后者指能够使用比原始指定的派生类型的派生程度更小(不太具体的)的类型.[MSDN] 公式: ...

  10. 使用css实现水平垂直居中

    1.通过absolute和margin实现(适用于弹窗,具体位置随浏览器屏幕大小变化改变)这种方式需要居中元素的父级必须采用绝对定位或相对定位,被居中元素的尺寸需要固定. <div class= ...