第8章:对象引用,可变性和垃圾回收
在Python里面变量不是盒子,而是便利贴,类似于Java中的引用变量,因此最好把它们理解为附加在对象上的标注。

因为变量不过是标注,因此无法阻止为对象贴上多个标注。贴的多个标注,就是别名。

lewis是charles的别名,即两个变量绑定同一个对象,但alex不是charles的别名,因为二者绑定的是不同的对象。alex和charles绑定的对象具有相同的值。 ==比较的就是值,但是它们的标示不同。

每个变量都有标识,类型和值,对象一旦创建,它的标识绝不会变;你可以把标识理解为对象在内存中的地址。 is运算符比较的是两个对象的标识;id()函数返对象标识的整数表示。

is运算符比==速度快,因为它不能重栽,所以Python不用寻找并调用特殊方法,而是直接比较两个整数ID。而a ==b 是语法糖,等同于a.eq(b)。继承自object的__eq__方法比较两个对象的ID,结果和is一样。但是多数内置类型使用更有意义的方式覆盖了__eq__方法,会考虑对象属性的值。相等性测试可能涉及大量的处理工作,例如,比较大型集合或嵌套层级深的结构时。

元组的不可变性其是指tuple数据结构的物理内容(即保存的引用)不可变,与引用的对象无关。元素的值会随着引用的可变对象的变化而变。元组中不可变的是元素的标识。

浅复制 VS 深复制
构造方法或者[:]做的是浅复制,即复制了最外层的容器,副本中的元素是源容器的引用,如果所有的元素都是不可变的,那么这样没问题,还能节省内存,但是如果有可变的元素,可能就会导致意想不到的问题。

有时候我们需要的是深拷贝,即副本不共享内部对象的引用,copy模块提供的deepcopy和copy函数能为任意对象做深复制和浅复制

import copy
x = [1, 2, 3,  [4, 5]]
y = copy.copy(x)
z = copy.deepcopy(x)

函数的参数作为引用时
Python唯一支持的参数传递模型是共享传参(call by sharing)。多数面向对象语言都采用这一模式,包括ruby, smalltalk和java(java的引用类型是这样,基本类型按值传参)。共享传参函数的各个形式参数获得实参中各个引用的副本。也就是说,函数内部的形参是实参的别名。
这种方案的结果是,函数可能会修改作为参数传入的可变对象,但是无法修改那些对象的标识(即不能把一个对象替换成另一个对象)。

不要使用可变类型作为函数参数的默认值
备受幽灵乘客折磨的校车
上面这个例子出现的根本原因在于:默认值在定义函数时计算(通常是加载模块时),因此默认值变成了函数对象的属性,因此,如果默认值是可变对象,而且修改了它的值,那么后续的函数调用都会受到影响。
可变默认值导致的这个问题说明了为什么通常使用None作为接收可变值的参数的默认值。

防御可变参数
如果定义的函数接收可变参数,应该谨慎考虑调用方是否期望修改传入的参数
例如,如果函数接收一个字典,而且在处理的过程中需要修改它,那么这个副作用要不要体现在函数外部?具体情况具体分析,这其实需要函数的编写者和调用方达成共识。

del与垃圾回收
del语句删除名称,而不是对象。del命令可能会导致对象当作垃圾回收,但是仅当删除的变量保存的是对象的最后一个引用,或者无法得到对象时。重新绑定也可能会导致对象的引用数量归零,导致对象被销毁。
在CPython中,垃圾回收使用的主要算法是引用计数。

弱引用这一块没太看明白
Python对不可变数据类型施加的把戏
与列表不同的是,对元组而言,tuple(t)或者t[:]不创建副本,而是返回同一对象的引用。str,bytes等也有类似的行为。

可变数据类型VS不可变数据类型

python中的数据类型可分为6类:

  1. Number(数字) (bool布尔类型、int整型、float浮点型、complex复数等都归为Number数字类型)
  2. String(字符串)
  3. Tuple (元组)
  4. List(列表)
  5. Dictionary (字典)
  6. Sets(集合)
    其中不可变类型为number、string、tuple,可变类型为:list、dict、set

1 不可变数据类型

不可变类型的变量在第一次赋值声明的时候,会在内存中开辟一块空间,用来存储这个变量被赋予的值,变量被声明后,变量的值就与开辟的内存空间绑定,我们不能修改存储在内存中的值,当我们想给此变量赋新值时,会开辟一块新的内存空间保存新的值。

不可变数据类型的值变化,地址也会变。

2 可变数据类型

可变类型的变量在第一次赋值声明的时候,也会在内存中开辟一块空间,用来存储这个变量被赋予的值。我们能修改存储在内存中的值,当该变量的值发生了改变,它对应的内存地址不发生改变。

可变数据类型变量中的值变化,地址不会变。若对变量进行重新赋值,则变量的地址也会改变。


上面的第二点,也是为什么str进行n个字符串的拼接时,不推荐for循环+=,而是用join,因为str是不可变对象,需要不停地创建新对象,故前者的效率就会非常的低。

流畅的Python读书笔记-第八章-对象引用、可变性和垃圾回收相关推荐

  1. python用可变参数求积_流畅的python读书笔记-第八章-对象引用、可变性和垃圾回收...

    对象不是个盒子 class Gizmo: def __init__(self): print('Gizmo id: %d' % id(self)) x = Gizmo() print(x) y = G ...

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

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

  3. 流畅的python读书笔记④:文本和字节序列

    人类使用文本,计算机使用字节序列. --Esther Nam 和 Travis Fischer "Character Encoding and Unicode in Python" ...

  4. 流畅的Python读书笔记

    流畅的Python 说明 我发现流畅的python更适合我现在看,因为它写的很详细.而effective python知识点不是很连贯,我先看完这本书,再去过一遍effective python吧! ...

  5. 流畅的python读书笔记-第一章Python 数据模型

    第一章 python数据类型 1 隐式方法 利用collections.namedtuple 快速生成类 import collectionsCard = collections.namedtuple ...

  6. python读书笔记2000_流畅的Python读书笔记

    特殊方法的存在是为了Python解释器调用的,你自己并不需要去调用他们,比如说my_object.len()这种写法是没有的,应该使用len(my_object).在使用len(my_object)的 ...

  7. python vector_[流畅的Python]读书笔记之十三运算符重载

    运算符重载 Python 关于运算符重载的规则: 不能重载内置类型的运算符 不能新建,只能重载 某些运算符不能重载--is.and.or 和 not 一元运算符 __neg__ __pos__ __i ...

  8. 《Fluent Python》学习笔记:第 8 章 对象引用、可变性和垃圾回收

    本文主要是 Fluent Python 第 8 章的学习笔记.这部分主要是介绍了变量.引用.对象.深拷贝.浅拷贝.垃圾回收等.本章虽然枯燥,但是非常有用. <Fluent Python>学 ...

  9. 与孩子一起学编程python_与孩子一起学编程(Python读书笔记3)

    第十一章 嵌套与可变循环 Python 3.X里 print()函数默认是自动换行的,所以本章代码会有很多问题,实际上 print()函数里有一个默认参数 end, 默认情况下: end= " ...

最新文章

  1. 设计模式 - 观察者模式(JDK)
  2. 剑指Offer_08_跳台阶
  3. 为什么将 0.1f 改为 0 会使性能降低 10 倍?
  4. RHEL/CentOS/Fedora各种源(EPEL、Remi、RPMForge、RPMFusion)配置
  5. 【Google Play】应用 “更新被拒“ 后续处理 ( 上传新版本后 , 一定要停用被拒的版本, 才可以通过审核 | 停用被拒的版本 | 送审 )
  6. Apache的简单应用
  7. 【CyberSecurityLearning 59】OS命令注入
  8. 我也分享一个c# ini操作类
  9. 【ASP.NET】登陆成功后如何跳转到上一个页面
  10. 浅谈开关量采集回路的设计及交流干扰问题解决方案
  11. 【计算机网络】因特网结构
  12. 这款免费小工具,让你的Mac也能实现右键新建
  13. opcua协议服务器端口号,opc ua服务器 数据配置
  14. 数字信号处理2:傅里叶变换
  15. 属性动画中同一个动画改变多个属性
  16. java枚举比较_java枚举enum equal与==
  17. SQL Server-【知识与实战VIII】触发器(中)
  18. 少样本学习系列(一)【Metrics-Based Methods】
  19. RK px30 配置ap6212 wifi bt流程记录
  20. 写个单机版斗地主程序,复习c++面向对象

热门文章

  1. android高仿京东秒杀,Android通过实现GridView的横向滚动实现仿京东秒杀效果
  2. 来 CSDN 实习技术编辑,直面改变世界的技术与人物
  3. 文档自动分类模型--分类算法思路总结
  4. SQL语句中引号(')、quotedstr()、('')、format()在SQL语句中的用法
  5. Python字符串中提取国家名称
  6. 目标检测学习笔记2——ResNet残差网络学习、ResNet论文解读
  7. php memcached mysql_php memcached+Mysql(主从)
  8. 浅谈滴滴需求响应式公交背后的技术
  9. SQL Server 2016 [修改数据库名称]及[添加次文件和日志文件]
  10. Python爬虫:逆向分析某云音乐加密参数