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

【python】变量和对象 在Python中,对象和变量是两个核心概念,但它们之间的关系和在其他一些编程语言中可能有所不同。Python中的一切都是对象,但变量并不是“盒子”或“容器”来存放这些对象,而是对象的“标签”或“引用”。敲黑板:Python中的一切都是对象。 阅读详情

目录

一、变量不是盒子

二、标识、相等性和别名

对象的标识、类型和值

== 和 is的不同

元组的相对不可变性

三、默认做浅拷贝

浅拷贝

深拷贝

四、函数的参数作为引用

python函数默认引用传参

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

防御可变参数

五、del和垃圾回收

六、弱引用

弱引用可调用,返回所指对象

WeakValueDictionary

弱引用的局限


一、变量不是盒子

python中变量不是盒子,而是盒子上贴的标签。对象才是盒子。对象一般是指一块存储空间,变量是对象上贴的标签,一个对象可以贴好多个标签,即可以对应很多个变量名。如下例子,把变量a和b分配给了同一个列表对象,类似于C++中的引用概念,python中的变量的本质都是C++中的引用。

 

因为对象在右边,总是先于变量创建,因此正确说法是把某变量分配给某对象,而不是反过来。

二、标识、相等性和别名

对象的标识、类型和值

每个对象都有标识、类型和值。

  • 对象标识,一经对象创建,在对象的生命周期中标识就不会再改变。id()函数返回对象标识的整数表示。
  • 类型,对象对应的类型。
  • 值,两个对象的值可能一样,但是这还是两个不同的对象,因为其标识不同。

== 和 is的不同

== 运算符比较两个对象的值,而 is 比较对象的标识。

        一个特殊的例子,最常使用is检查变量绑定的值是不是None。

  • is运算符比 == 速度快,因为is不能重载,因此python不用寻找并调用特殊方法。
  • 而 a == b 是语法糖,等价于 a.__eq__(b),即调用魔术方法比较a与b。
  • 继承自object的最原始的__eq__方法等价于is,是直接比较id的,但是很多类型都重写了__eq__方法,去考虑值的相等性。

元组的相对不可变性

元组里保存的是元素的引用,但如果引用的元素是可变的,即便元组本身不可变,其元素也依然可以变化。即元组中不可变的是元素的标识,而不是元素的值。

三、默认做浅拷贝

浅拷贝

我们知道python中的变量不是盒子,二是标签,那么当我们要复制一个列表的时候,如果直接用

l2 = l1 则相当于l2和l1是别名,两个对应同一个对象。要复制列表最简单的方式是使用其构造函数。如下面例子中,l1 和 l2的值相同,但是是两个不同的对象。

对于列表和其它可变序列来说,还可以使用 l2 = l1[ : ] 来创建副本。

l1 = [1, 2, 3]
l2 = l1[:] # l2 = list(l1)得到的结果相同
print(l1 == l2)
print(l1 is l2)
print(l1[0] is l2[0])

根据实验结果可看出,用 l2 = l1[:] 创建副本时 l2与l1确实是不同的对象,但是由于列表对象中的元素是引用,而l2直接复制了l1中的引用,因此l1和l2中元素对应的是相同的对象。若所有元素不可变,这样做没有问题且可以节省内存,但如果有可变的元素则这样不对。

        综上,用构造方法或者[ : ]创建副本时做的都是浅拷贝。即只复制了外壳,副本中的元素都是源容器中元素的引用。

        接下来一个例子,对一个包含一个列表和一个元组的列表做浅拷贝。

  1. l2是l1的浅拷贝副本、
  2. 给l1列表加一个元素,100,此时不会影响到l2
  3. 给l1列表的第1个元素(即列表[66, 55, 44])移除元素55,因为l2中的元素是l1中元素的引用,因此此操作会影响到l2
  4. 给l2的第1个元素拼接上[33, 22](可变对象+=是原地操作),同理,l2中与l1中元素互为别名,因此会影响到l1
  5. 给l2的第2个元素拼接上(10, 11)(不可变对象+=会创建一个新对象绑定给原变量),因为元组不可变,因此拼接之后l2中对应位置的元组变成了一个新的元组对象(7,8,9,10,11),但是l1中不会改变,此时l1与l2中对应位置已经是不同的元组对象了。

        上述例子输出如下,符合预期。

深拷贝

深拷贝即副本不共享内部对象的引用。

        不管浅拷贝还是深拷贝,拷贝之后的副本与原对象肯定是不同的对象,即标识不同,但是浅拷贝中副本与原对象共享内部元素的引用。copy模块提供的deepcopy和copy函数能为任意对象深拷贝和浅拷贝。下面例子展示deepcopy和copy的用法。

from copy import deepcopy, copy

class Bus:
    
    def __init__(self, passengers=None): # 这里用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)

bus1 = Bus(['Alice', 'Bill', 'Claire', 'David'])
bus2 = copy(bus1)
bus3 = deepcopy(bus1)
print("three buses' ids: ", id(bus1), id(bus2), id(bus3))

bus1.drop('Bill')
print('bus1: ', bus1.passengers)
print('bus2: ', bus2.passengers)
print('bus3: ', bus3.passengers)

print("three buses' passengers' ids: ", id(bus1.passengers),id(bus2.passengers),id(bus3.passengers))

通过特殊方法__copy__()和__deepcopy__()可以控制copy和deepcopy的行为。

        含有循环引用的拷贝问题不做讨论。

四、函数的参数作为引用

python函数默认引用传参

C里边默认的传参方式是值传递,而python里边默认的传参方式是引用传递,即形参是实参的别名,因此如果传入的实参是可变对象,则函数体内可能会改变实参。如下例子所示,传入不可变对象时是改变不了实参的,因为 a += b,实际上a已经分配给一个新的对象了,因此不会改变实参。

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

函数的有些参数可以设置缺省/默认值,但是这个值不能用可变类型。

上边例子中把HauntedBus类的构造函数中passengers的默认值由None改成了空列表[ ]。带来的改变是某个HauntedBus类的对象的self.passengers属性是__init__函数的参数passengers的别名,而默认情况下,如果在构造的时候没有传参,即默认构造时,passengers时空列表[ ] 的别名。而空列表[ ] 这个时候已经变成了函数__init__的一个属性(python中函数是一等对象,因此空列表[ ]是函数对象__init__的属性这点不难理解。

        因此,当我们构造bus1时,因为传参构造,所以passengers是传入参数的别名,而非函数对象__init__的属性空列表[ ] 的别名,因此正常运行,不会有错。

        但是当我们构造bus2时,因为是默认构造,因此bus2的self.passengers实际上是函数对象__init__的属性空列表 [ ] 的别名,因此对于bus2的self.passengers属性的一切操作都是反应到函数对象__init__的属性上,因此当我们默认构造bus3的时候,实际上这个时候默认的passengers已经不是空列表了,而且bus2和bus3的self.passengers属性是同一个列表对象的别名(这个列表对象即为构造函数中的默认列表参数)。

防御可变参数

如果定义的函数接收可变参数,需要谨慎考虑是否修改传入的参数。

 

还是这个校车类,下面例子中我们传入实参basketball_team,然后经过校车类对象处理后影响到了实参,如果要避免影响到实参,在构造函数中应该给对象的self.passengers属性分配实参的一个副本,而不应该直接跟实参绑定。

 

改造方案如下:

五、del和垃圾回收

del只会删除对象的引用,而不会删除对象,但删除对象的引用可能会导致对象被删除。

python对象被删除有两种情况:

  1. 某个对象的引用计数为零
  2. 一组对象之间全是相互引用,导致组中对象不可获取

        两种情况可以归结于同一种情况,即这个对象不可获取了,那么就会被当作垃圾回收。

weakref.finalize用函数bye来监视被s1绑定的对象,如果该对象被回收,则bye就会被调用,其返回值ender可以看s1绑定对象的状态,一开始的时候肯定是或者的,即 alive == True,当我们用del删除s1的时候,bye并没有被调用,因此对象没有被删除,这是因为对象还有一个引用s2,引用计数并不等于0。但是当我们将s2指向其他对象(即‘spam’)的时候,原先的对象就不可获取了,因此会被回收,也因此bye函数被调用的,而ender.alive也变成False。

        有一点问题是,我们在ender = weakref.finalize中把s1引用传给了finalize函数了,为了监控对象{1, 2,3}和调用回调,理论上是必须要引用{1,2,3}的,那么为什么最终{1,2,3}被销毁了呢?这是因为finalize持有{1,2,3}的弱引用。

六、弱引用

弱引用可调用,返回所指对象

  

 

首先有一点注意,python控制台会自动把 _ 变量绑定到结果不为None的表达式结果上,因此可能会隐式地增加了新的引用。

  1. 创建一个弱引用
  2. 弱引用是可调用对象,返回值即被引用的对象,需要注意的是因为控制台输出了{0,1},因给其此增加了一个新的引用,即 _
  3. 将a_set不再引用{0,1}集合,引用数量减少了
  4. 调用wref()仍然能返回{0,1},这是因为调用的时候其还有一个引用 _,
  5. 但是当调用wref完成后,控制台输出False,_就绑定到了False上,因此{0,1}被回收。
  6. 上一步{0,1}已被回收,因此这里弱引用为None,弱引用不会妨碍所指对象被当作垃圾回收

        weakref.ref类是低级接口,不要直接使用,应该使用weakref集合(WeakKeyDictionary、WeakValueDictionary、WeakSet)和finalize。

WeakValueDictionary

实现一种可变映射,键是对象的某种可散列的属性,值值对象的弱引用。如果对象被回收,则对应的键会从WeakValueDictionary中删除。

 

  1.  stock是WeakValueDictionary实例
  2.  stock把cheese对象中属性,即奶酪的名称映射到cheese对象的弱引用上
  3.  stock中的所有键,即不同奶酪的名称,此时一共四个
  4.  删除catalog,即cheese对象的列表名称后,stock大多数奶酪都不见了,但是还剩下了一个Parmesan,为什么?原因是在for cheese in catalog这一语句中,cheese是一个全局变量,因此其最后一次循环引用了Parmesan,因此del catalog后,前三个奶酪引用计数都归零,只有Parmesan引用计数为1。

弱引用的局限

不是每个python对象都可以作为弱引用的所指对象。

  • list和dict实例不能作为所指对象,但是他们的子类可以。
  • set可以作为所指对象
  • 自定义类型可以作为所指对象
  • int和tuple不能作为所指对象,其子类也不行+

由于弱引用并不保证引用对象不会被回收,因此如果代码中需要用到循环引用,则可以用弱引用来实现,用弱引用可以解决循环引用不能正常垃圾回收的问题。

你真的理解Python中的变量吗?它仅仅是名字吗?还是相当于C语言中的内存储存盒子?还是指针?请看视频并请反馈讨论 你真的理解Python中的变量吗?它仅仅是名字吗?还是相当于C语言中的内存储存盒子?还是指针?请看视频并请反馈讨论。 未来程序员们,你真的知道Python语言吗?Python中的变量是变动的吗?变量是盒子储存说,指针说是正确的吗? ... 阅读详情

相关推荐

Proxmox VE安装卡顿深度解析:显卡驱动与BIOS设置的黄金法则

本文深度解析Proxmox VE安装卡顿的根本原因,指出显卡驱动与BIOS设置是两大关键因素。文章详细阐述了如何通过添加`nomodeset`内核参数解决显卡兼容性问题,并提供了针对不同主板品牌的BIOS显卡优先级设置黄金法则。同时,还分享了从预处理到高级调试的完整实战排查流程,帮助用户从源头杜绝安装卡顿,确保PVE系统顺利部署。

weixin_29278805的博客 471

当Python变量遇到对象:你可能从未真正认识过它们

很多Python初学者以为学会了a = 10这个看似简单的函数,暴露了Python最核心的秘密——对象与变量的微妙关系。今天我们不谈基础语法,带你直击Python最易被误解的三个真相。

CDMYC的博客 431

麒麟信安3.3-6C电网版虚拟机安装避坑指南:从ISO下载到SSH配置全流程

本文提供麒麟信安3.3-6C电网版虚拟机的详细安装与配置指南。针对电力行业仿真测试需求,重点解析从ISO镜像获取、虚拟机环境准备、安装过程中的三大“雷区”(如多管理员密码逻辑、分区方案、网络配置)到首次启动后的网络、SSH及root策略配置的全流程避坑要点,帮助技术人员高效、安全地完成部署。

rainy的博客 853

Python必知必会:变量是标签还是盒子?

在 Python 中,变量可以被理解为标签,与其他一些编程语言中将变量视为存储数据的容器(盒子)的观念不同。在 Python 中,数据存储在内存中的对象里,而变量则像是贴在这些对象上的标签。

m0_74942241的博客 997

从ViT到CLIP:OpenAI如何用4亿张图‘教会’AI看懂世界?一次讲透对比学习与Prompt工程

本文深入解析OpenAI的CLIP模型如何通过4亿图文对的对比学习实现跨模态理解,详细探讨了对比学习、数据构建、模型架构及Prompt工程等核心技术。CLIP利用Transformer架构和精心设计的Prompt模板,在Zero-Shot分类、图像检索等场景展现出强大能力,为多模态AI应用开辟新方向。

weixin_27027459的博客 371

深入解析高通8155平台音频数据流:从HAL到DSP的完整链路

本文深入解析了高通8155平台音频数据从安卓HAL层到DSP的完整传输链路。以播放场景为例,详细阐述了音频数据如何通过ASoC DPCM框架进行路由、打包,并经由APR协议与DSP交互,最终驱动硬件发声的核心流程,为车载音频系统开发与调试提供了清晰的框架。

rust6ferris的博客 1174

python:变量

等号(=)用来给变量赋值。等号(=)运算符左边是一个变量名,等号(=)运算符右边是存储在变量中的值Python允许你同时为多个变量赋值。您也可以为多个对象指定多个变量。每个变量使用前必须赋值,变量赋值之后该变量才会被创建一个变量可以通过赋值指向不同类型的对象。

OceanStar的博客 689

AI落地困局与破局者FDE:从技术神话到价值实干的战略转型

AI落地困局与破局者FDE:从技术神话到价值实干的战略转型 当前AI企业级应用面临三大核心挑战:业务场景深度非标化、技术落地"最后一公里"困局、以及市场竞争焦点转向实用价值。前线部署工程师(FDE)作为破局关键,通过技术-业务-产品三维交汇的复合能力,将AI从实验室推向生产环境。FDE不仅是技术架构师,更是业务价值挖掘机和产品进化传感器,通过"碎石路-高速公路"双循环模式,将定制化需求沉淀为可复用的平台能力。这种模式颠覆了传统SaaS的销售逻辑,形成基于价值的J型增长

随笔记录-分享&记忆 3983

流畅的Python笔记

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

ccnuacmhdu的博客 1085

进程间通信的七种方法实战演示!值得收藏!

线程和进程间的通讯(Inter-Process Communication, IPC)是操作系统中的一个重要概念,用于实现不同进程或同一进程中的不同线程之间的数据交换和协调。以下是几个常见的进程间通信的方式:管道、消息队列、共享内存、信号、套接字、信号量、文件映射

十年饮冰,难凉热血,保持热爱,奔赴星海! 2816

C#图像处理:OpenCVSharp实现简单人脸识别

人脸识别是计算机视觉领域中的一个重要研究方向,它可以通过分析和比对人脸图像,实现识别和验证的功能。希望通过这篇文章的学习,你对OpenCVSharp和人脸识别有了初步的了解,并能够运用这些知识进行自己的项目开发。当我们运行程序时,它会加载人脸识别模型并读取待识别的图像,然后进行人脸检测并在图像上标记出检测到的人脸位置。当然,这只是一个入门级的示例,实际的人脸识别系统还需要更加复杂的算法和大量的训练数据来提高准确性和鲁棒性。最后,我们遍历检测到的人脸,并在原始图像上绘制矩形框,标记出检测到的人脸位置。

WELL_CODER的博客 1129

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

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

随心写写 303

6.3 节深度拆解:Hermes Agent 多 Agent 协同执行链路的 4 层设计逻辑

拆解 Hermes 多 Agent 协同的 4 层工程化设计(协议层、编排层、执行层、适配层),聚焦协议层的强约束消息 Schema 如何解决 Agent 间语义不一致问题,并提供 `soul.md` 配置、GLM-4.7Flash 结构化输出验证及 v0.13.0/v0.14.0 版本实操避坑指南

weixin_42520239的博客 121

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

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

dianshuochi1092的博客 254

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

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

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

Murphy_31的博客 604

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

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

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

言之。 1万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

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

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

日积月累,天道酬勤 1237

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

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

Murphy_31的博客 489

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

fluent python读书笔记

pku_langzi的博客 370

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

引用式变量 不知道大家对python中的变量是怎么理解的? 假设有如下代码,怎么理解a和b的关系? a=1 b=a 没错,正确的理解为第二种,在python中定义一个变量时,并给它“赋值”,其实你并没有真正的把值给它,而是在这个值上贴了一个标签而已,以后看到这个标签就知道是这个值啦! 我们通过id()来验证这一点: 因此,说python中的变量是引用式变量再确切不过了! 在==和is之间选择 ==运算符比较的是两个对象的值,而is比较对象的标识。下面的这个例子很好的说明了..

max_LLL的博客 865

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

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

T0UGH 110

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

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

2772

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

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

liuhaichao666的博客 307

流畅的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

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

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

weixin_30674525的博客 142

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

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

牟涛的博客 270
上一篇: 流畅的python笔记(七)函数装饰器和闭包
下一篇: 流畅的python笔记(九)符合python风格的对象
罗古洞的女婿
博客等级 码龄10年 1117粉丝 125原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值