《流畅的python》学习笔记之对象引用,可变性和垃圾回收

ComfyUI安装包运行前准备:安装Git Git 是一个分布式版本控制系统(Version Control System, VCS),用于跟踪和管理文件(尤其是代码)的变更历史。 简单理解就是,git是用来管理文件的版本的,如果有新的版本,就可以使用git来更新。 阅读详情

引用式变量

不知道大家对python中的变量是怎么理解的?

假设有如下代码,怎么理解a和b的关系?

a=1

b=a

没错,正确的理解为第二种,在python中定义一个变量时,并给它“赋值”,其实你并没有真正的把值给它,而是在这个值上贴了一个标签而已,以后看到这个标签就知道是这个值啦!

我们通过id()来验证这一点:

因此,说python中的变量是引用式变量再确切不过了!

在==和is之间选择

==运算符比较的是两个对象的值,而is比较对象的标识。下面的这个例子很好的说明了这个问题。

 a和b两个变量分别是两个值相同但地址不同的数组的标签。

值得注意的是,is运算符比==速度快,因为它不能重载,所以python不用寻找并调用特殊方法(魔法方法),而是直接比较两个整数ID。而a==b是语法糖,等同于a.__eq__(b)。继承自object的__eq__方法比较两个对象的ID,结果与is一样。但是多数内置类型使用更具有意义的方式覆盖了__eq__方法,会考虑对象属性的值。

元组的相对不可变性

你记忆中的元组是不可变类型吗?来看个例子吧!

 不知道你们的第一想法是不是这样的:咦?不是说元组是不可变类型吗?为什么还能添加新的元素???

看到下面的例子也许可以解开你的谜底!

可以看到,在添加元素前后,元组的id是没有发生变化的,也就是说还是同一个元组,并且元组中的最后一个元素(数组)的id也没有发生变化!不知道你们还记不记得:元组属于容器序列,保存的是对象的引用。那么这就说的通了!因为保存的是数组的引用(标签),在素组中添加或者删除元素是没有问题的,而元组中对它的引用是没有改变的。

一句话总结:元组的值会随着引用的可变对象(比如数组就是可变对象)的变化而变,元组中不可变的是元素的标签(引用)。

浅复制和深复制 

来看一个例子:

from copy import copy, deepcopy


# 校车乘客在途中上车和下车
class Bus:

    # 初始化
    def __init__(self, passengers=None):
        if passengers is None:
            self.passengers = []
        else:
            self.passengers = list(passengers)

    # 上车
    def pick(self, name):
        self.passengers.append(name)

    # 下车
    def drop(self, name):
        self.passengers.remove(name)


if __name__ == '__main__':
    bus = Bus(['Tom', 'Autumn', 'Kim', 'Olivia'])
    bus1 = copy(bus)  # 浅复制得到bus1
    bus2 = deepcopy(bus)  # 深复制得到bus2

    print(id(bus))
    print(id(bus1))
    print(id(bus2))

    bus.pick('Jack')
    print(bus.passengers, id(bus.passengers[0]), id(bus.passengers))
    print(bus1.passengers, id(bus1.passengers[0]), id(bus1.passengers))
    print(bus2.passengers)

bus是最原始的,bus1通过浅拷贝得到,bus2通过深拷贝得到,在对源bus进行操作时,浅拷贝得到的bus1会受到影响,而深拷贝得到的bus2却不会。 

 个人理解:
        不管是浅复制还是深复制,得到的对象都是新的,但是深复制得到的对象的元素(属性)的值都是新的(另外开辟空间得到的),而浅复制得到的对象的元素(属性)是对源对象的引用。

不要使用可变类型作为参数的默认值

举一个神奇的栗子看一下!

def _append(a=[]):
    a.append(1)
    return a


if __name__ == '__main__':
    a = _append()  # 如果没有传入参数,则使用默认的值
    print(a)
    a = _append()  # 还是使用的同一个默认参数
    print(a)

  

 不知道结果是不是有点出乎你们的意料???为什么不是两个一模一样的数组[1]?通过结果可能就会想到两次方法的调用使用的是同一个数组。没错,就是这样的!首先得知道的一点是:在给函数传参时,传入的是对变量的引用!对于缺省参数也是一样的,上面的这个栗子中,因为没有传入参数,所以使用默认值空列表,而这个默认列表在函数定义时就生成了,也就是说这里是对这个空列表的引用,当第二次调用方法时,因为也没有传入参数,因此还是对这个空列表的引用,所以两次操作的其实是同一个列表,因此得到如上的结果就不意外啦!

     个人理解:
            在未传入参数的情况下,所有的对象会公用默认参数,如果默认参数是可变的,那么后果不堪设想!

del和垃圾回收

del语句删除名称(标签),而不是对象。仅当删除的是最后一个引用时,或无法得到对象时,才会将对象进行垃圾回收。

在Cpython中,垃圾回收使用的主要算法是引用计数。每次给对象添加一个新的标签时,会进行急速加一操作,同理,当进行标签“撕毁”时,就进行减一操作,当一个对象身上没有标签时,计数归零,对象就会被立即销毁。

同步更新于个人博客系统:《流畅的python》学习笔记之对象引用,可变性和垃圾回收

【实践】VECTOR AUTOSAR创建SWC读写CAN信号 在AUTOSAR开发中最必要的功能就是读写CAN信号,本文通过一步步说明,介绍如何开发SWC来读写CAN信号,可以说在AUTOSAR中实现读写CAN信号的实践过程,是一个非常基础且典型的练习。在本篇文章阅读之前,推荐阅读AUTOSAR RTE介绍,本篇文章介绍了RTE的比较全面的介绍了AUTOSAR RTE。理解了RTE之后,才能对SWC的设计更加清楚。话不多说,接着上一篇内容VECTOR DaVinci从0到1搭建工程,此篇文章我们介绍如何在DaVinci Developer中开发SWC访问CAN信号。为 阅读详情

相关推荐

告别纯代码:用Visual Studio为LabVIEW封装一个‘即插即用’的海康VisionMaster控件

本文介绍如何利用Visual Studio为LabVIEW封装一个‘即插即用’的海康VisionMaster控件,解决传统集成方式中的代码臃肿和维护困难问题。通过.NET控件封装核心功能,实现LabVIEW与VisionMaster的高效对接,显著提升工业自动化开发效率。

weixin_33744854的博客 504

流畅的python学习笔记(五):面向对象惯用法(1:对象引用、可变性和垃圾回收 )

函数装饰器和闭包1. 变量不是盒子 本章的主题是对象与对象名称之间的区别。名称不是对象,而是单独的东西。 本章先以一个比喻说明 Python 的变量:变量是标注,而不是盒子。如果你不知道引用式变量是什么,可以像这样对别人解释别名。 本章讨论对象标识、值和别名等概念。随后,本章会揭露元组的一个神奇特性:元组是不可变的,但是其中的值可以改变,之后就引申到浅复制和深复制。接下来的话题是引用和函数参数:可变的参数默认值导致的问题,以及如何安全地处理函数的调用者传入的可变参数。 本章最后一节讨论垃圾回收、del 命

qq_36591680的博客 646

峰岹FU6832L双核电机控制芯片实战:从FOC算法到BLDC/PMSM驱动开发

在嵌入式系统和电机控制领域,磁场定向控制(FOC)是实现无刷直流电机(BLDC)和永磁同步电机(PMSM)高效、平稳运行的核心算法。其原理是通过坐标变换将三相交流量分解为直流量,实现类似直流电机的转矩与磁场解耦控制,从而提升效率、降低噪音与振动。这项技术的工程价值在于能以更低的处理器开销实现高性能驱动,广泛应用于消费电子、工业自动化与智能家电。本文以峰岹FU6832L芯片为例,深入解析其独特的双核架构——将实时性要求极高的FOC运算交由专用硬件引擎处理,解放主控CPU处理应用逻辑,并结合PID参数整定、电流

weixin_29570795的博客 508

流畅的python-学习笔记_对象引用、可变性、垃圾回收

即变量是引用,而不是实际内存,多个标识赋值相同变量时,多余标识是引用。

peter6768的博客 395

【Lane】 Ultra-Fast-Lane-Detection 复现

引言 车道线检测源码复现以及训练自己的数据集 1 环境搭建 conda create -n lane python=3.7 conda activate lane # 激活环境 conda install pytorch torchvision cudatoolkit=10.1 -c pytorch pip install -r requirements.txt 2 下载项目源码 若在服务器上可以用指令下载,否则直接在网址中下载 git clone https://github.com/cfzd/U

qq_44703886的博客 2万+

嵌入式充电协议深度解析:从QC到PD3.1的技术演进与实战应用

本文深入解析了从QC到PD3.1的嵌入式充电协议技术演进与实战应用。通过电压谈判、协议芯片设计、Type-C接口优化等关键技术,详细介绍了快充协议在嵌入式系统中的实现挑战与解决方案,包括兼容性测试、EMC问题处理及空间限制创新设计,为开发者提供了宝贵的实践经验。

weixin_29194817的博客 419

流畅的Python:对象引用、可变性和垃圾回收

文章目录对象引用、可变性和垃圾回收1. 变量不是盒子2. 标识、相等性和别名3. 在**==**和is之间选择4. 元组的相对不可变性5. 默认做浅复制6.为任意对象做深复制和浅复制7. 函数的参数作为引用时不要使用可变类型作为参数的默认值8. 防御可变参数9. del和垃圾回收10. 弱引用WeakValueDictionary简介:11. 弱引用的局限12. Python对不可变类型施加的把戏...

随心写写 303

FPGA时钟架构解密:从SRCC/MRCC到全局时钟树的实战指南

本文深入解析Xilinx 7系列FPGA时钟架构,从SRCC/MRCC引脚特性到全局时钟树设计,详细介绍了BUFG、BUFMR等关键组件的应用场景和优化策略。通过对比SRCC与MRCC的驱动范围及适用场景,提供低抖动时钟布线技巧和时钟域交叉(CDC)设计方法,帮助工程师构建高性能FPGA时钟系统。

weixin_29191081的博客 1483

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

对象引用、可变性和垃圾回收 变量不是盒子 人们经常使用“变量是盒子”这样的比喻,但是这有碍于理解面向对象语言中的引用式变量。Python 变量类似于 Java 中的引用式变量,因此最好把它们理解为附加在对象上的标注。在示例 8-1 所示的交互式控制台中,无法使用“变量是盒子”做解释。图8-1 说明了在 Python 中为什么不能使用盒子比喻,而便利贴则指出了变量的正确工作方式。示例 ...

dianshuochi1092的博客 254

雷电模拟器安装面具环境并过软件检测系列(看这一篇就够了!)

雷电模拟器安装面具环境并过基本软件的环境检测

qq_45059975的博客 6万+

【Bug已解决】Codex CLI 报错 apply_patch 失败:无法应用补丁的解决方案

方案适用场景推荐指数统一换行符规范跨平台协作项目的标准配置⭐⭐⭐⭐⭐关闭自动格式化冲突IDE 与 Codex 并发编辑同一文件⭐⭐⭐⭐缩小任务改动范围长期有效的使用习惯优化⭐⭐⭐⭐⭐统一 UTF-8 编码涉及非 UTF-8 遗留文件的项目⭐⭐⭐提示重新读取文件单次失败后的快速恢复方式⭐⭐⭐⭐报错的本质是Codex 生成补丁时读取的文件内容,与实际应用补丁时磁盘上的文件内容出现了不一致,常见诱因包括换行符风格混用、文件被其他工具并发修改、编码问题等。

一键难忘的博客 7289

流畅的python:对象引用、可变性、垃圾回收-Part2

文章目录1、回顾2、函数参数3、del和垃圾回收4、弱引用5、不可变对象的陷阱(选读) 1、回顾 我们首先对上一部分的内容进行简单的回顾: 变量的产生:这个地方是我觉得上一部分最重要的地方,一定要注意,python首先创建一个对象,然后变量名对其进行标注。对应于赋值语句中,先执行=号右侧的对象创建语句,然后将该对象绑定到-号左侧的变量名上。 序列保存方式:python中大多数的序列保存的是子序列...

Murphy_31的博客 604

SAP 未清PO数量 = 采购订单数量 - 已收货数量

本文介绍了SAP系统中查询未清PO数量的6种方法:1.标准采购报表(ME2L/ME2M/ME2N)适合业务用户快速查询;2.物料需求报表(MD04)可查看单个物料的供需情况;3.SQVI快速查询器提供自定义字段的灵活性;4.ABAP报表适合开发人员处理复杂逻辑;5.SAPQuery经配置后可供业务用户使用;6.BI/HANA方案适合大数据量分析。每种方法各有优缺点,用户可根据自身技术水平和具体需求选择,日常查询推荐使用标准采购报表ME2L/ME2M。

金牌架构师 1847

对象引用-可变性-垃圾回收

文章目录变量== 与 is 的区别弱引用删除 catalog 之后,stock 中的大多数奶酪都不见了,这是 WeakValueDictionary 的预期行为。为什么不是全部呢元组的相对不可变性小结 变量 python和java中的变量本质不一样, python中的变量本质是指针, 类似生活中的便利贴, 可以贴在任何对象上。(java中的变量像一个已经定制好的盒子)。 a = 1 过程 : 先到内存中申请一块int空间 把 a 贴在这块内存空间上 便利贴的大小是固定的, 所以a可以帖在任何对

言之。 1万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

流畅的python:对象引用、可变性、垃圾回收-Part1

第八章 对象应用、可变性、垃圾回收-Part1 文章目录第八章 对象应用、可变性、垃圾回收-Part11、到底什么是变量?2、标识、相等性和别名3、元组的相对不可变性4、浅复制5、深复制 1、到底什么是变量? 从一开始学python,你可能就知道,python中的一切都是对象,那变量到底跟对象有啥关系?我们先看这样的一个例子: class Onevar(): def __init__(se...

Murphy_31的博客 489

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

[流畅的Python][8][对象引用、可变性和垃圾回收]

第8章 对象引用、可变性和垃圾回收 “你不开心,”白骑士用一种忧虑的声调说,“让我给你唱一首歌安慰你吧……这首歌的曲名叫作 :《黑线鳕的眼睛》。”“哦,那是一首歌的曲名,是吗?”爱丽丝问道,她试着使自己感到有兴趣。“不,你不明白,”白骑士说,看来有些心烦的样子,“那是人家这么叫的曲名。真正的曲名是《老而又老的老头儿》。”(改编自第8 ...

T0UGH 110

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

《流畅的Python第二版》读书笔记——对象引用、可变性和垃圾回收

讨论对象标识、值和别名、引用和函数参数以及垃圾回收等知识。

日积月累,天道酬勤 1237

记录学习《流畅的python》的一些知识-----对象引用,可变性和垃圾回收

记录我学习《流畅的python》的过程2021.9.22 2021.9.22 1.变量不是盒子 如果把变量想象为盒子,那么无法解释Python中的赋值;应该把变量视作便利贴,这样图片中的行为就好解释了。

liuhaichao666的博客 307

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

fluent python读书笔记

pku_langzi的博客 370

《流畅的Python》读书笔记07: 第一部分 数据结构 - 对象引用、可变性和垃圾回收

流畅的 Python》第 6 章(第 2 版,在原第 1 版中为第 8 章)深入探讨了一个基础但至关重要的主题:Python 中对象引用的本质、可变性及其对程序行为的影响。本章从打破“变量是盒子”这一传统思维定式开始,逐步揭示出 Python 变量体系的真实面貌,最后深入垃圾回收机制。本章虽然内容偏“枯燥”,但却是理解 Python 这门语言底层运行机制、排查程序隐秘 bug 的关键。变量的实质:变量是对对象的标签(引用),而不是存储数据的容器。对象的标识、相等性与别名is。

2772

流畅的python第八章--对象引用 可变性 垃圾回收

本章内容: 对象引用 : 引用式变量 对象标识符,值,别名 可变性 元组特性 潜复制和深复制 引用和函数参数 垃圾回收 删除对象 弱引用 提示:本章内容理解不清很可能出现不易发现的错误 8.1 变量不是盒子 #a是对象[1,2,3]的标识,或者说引用式变量 a=[1,2,3] #b也是对象[1,2,3]的标签,或者说别名 b=a a.append(4) print(b) 对引用式变量来说,说把变量分配给对象更合理 8.2 标识、相等性和别名 charles={"name":"Charles L

You will~My hand 470

流畅的python8:对象引用,可变性和垃圾回收

8.1变量不是盒子 @ 变量是别名 8.2标识,相等性和别名 @使用is ,而不是比较id()相等 @注意,在不同的解释器中,id()返回的不一定是内存地址,但一定是唯一的标注,且在变量生命周期中不变。 8.2.1 在==和 is 之间选择 @==标记值相等,而 is 比较id()相等 @ == 调用的是__eq__()方法 8.2.2 元组的相对不可变性 @元组不变是指元组的引用不变。 8.3 默认做浅赋值 @注意列表的复制是浅复制 8.3 为对...

牟涛的博客 270

流畅的Python笔记

比如,要存放 1000 万个浮点数的话,数组(array)的效率要高得多,因为数组在背后存的并不是 float 对象,而是数字的机器翻译,也就是字节表述。构造方法或 [:] 做的是浅复制(即复制了最外层容器,副本中的元素是源容器中元素的引用)。综上,闭包是一种函数,它会保留定义函数时存在的自由变量的绑定,这样调用函数时,虽然定义作用域不可用了,但是仍能使用那些绑定。注意,一般来说,深复制不是件简单的事。其实,闭包指延伸了作用域的函数,其中包含函数定义体中引用、但是不在定义体中定义的非全局变量。

ccnuacmhdu的博客 1085

第8章 对象引用、可变性和垃圾回收

1 #《流畅的Python》读书笔记 2 # 第四部分 面向对象惯用法 3 # 第8章 对象引用、可变性和垃圾回收 4 5 # 8.1 变量不是盒子 6 # Python 变量类似于 Java 中的引用式变量,因此最好把它们理解为附加在对象上的标注。 7 8 # 示例 8-1 变量 a 和 b 引用同一个列表,而不是那个列表的副本 9 #...

weixin_30674525的博客 142

python 对象引用、可变性 和 垃圾回收

文章目录1. 变量是标签2. 元组的相对不可变性3. 默认浅复制4. 函数的参数作为引用时 learn from 《流畅的python》 1. 变量是标签 >>> a = [1, 2, 3] >>> b = a >>> a.append(4) >>> b [1, 2, 3, 4] 对象的 id 在生命周期中是不变的 is 运算检查两者的 id 是否一致 == 检查两者内容(值)是否一样 is 运算符比 == 速度快,因为

Michael是个半路程序员 396

流畅的python笔记(八)对象引用、可变性和垃圾回收

一、变量不是盒子 python中变量不是盒子,而是盒子上贴的标签。对象才是盒子。对象一般是指一块存储空间,变量是对象上贴的标签,一个对象可以贴好多个标签,即可以对应很多个变量名。如下例子,把变量a和b分配给了同一个列表对象,类似于C++中的引用概念,python中的变量的本质都是C++中的引用。 因为对象在右边,总是先于变量创建,因此正确说法是把某变量分配给某对象,而不是反过来。 二、标识、相等性和别名 ...

向上吧贺凯 491
上一篇: 《流畅的python》学习笔记之函数装饰器和闭包
下一篇: leetcode之合并区间
白日梦想猿
博客等级 码龄6年 216粉丝 139原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值