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

1.python变量是什么

  • python的变量实质是一个指针,而java普通变量是一个容器直接存入值。

为什么b也变了呢,由于a,b同时指向同一个地址,导致a指向的内容改变也会让b改变,id()获得对象所指向的内存中的地址,如果是对象本身的地址的话a,b应该是不相同的。

1 a = [1, 2, 3]
2 b = a
3 # a和b实质是指针都指向同一个地址,修改a同时会修改b
4 print(id(a), id(b))  # 54866344 54866344
5 print(a is b)   # True
6
7 a.append(2)
8 print(a, b)  # [1, 2, 3, 2] [1, 2, 3, 2]

注:python变量生成步骤

  • 先建立对象[1,2,3,4] 赋值一个地址:19333544
  • 让a指向这个19333544地址
  • 再建立对象[1,2,3,4] 赋值一个地址:193335480
  • 让b指向这个193335480地址
  • 让c指向与a指向相同的地址

a和b指向不同的对象,c和a指向相同对象

1 a = [1, 2, 3, 4]
2 b = [1, 2, 3, 4]
3 c = a
4 print(id(a), id(b), id(c))  # 19333544 19333480 19333544

关键点:

对于小整数和小串字符建立都指向同一个地址,其他都是不同地址

1 a = 1
2 b = 1
3 c = a
4 print(id(a), id(b), id(c))  # 1399769008 1399769008 1399769008
5
6 a = "abc"
7 b = "abc"
8 c = a
9 print(id(a), id(b), id(c))  # 24048032 24048032 24048032

2.==和is的区别

  • ==:比较的是两个对象的值是否相等
  • is:比较的是两个对象的地址是否相等,比较id(a) == id(b)
1 a = [1, 2, 3, 4]
2 b = [1, 2, 3, 4]
3 c = a
4 print(id(a), id(b), id(c))  # 19333544 19333480 19333544
5 print(a is b, a is c, b is c)  # False True False
6 print(a == b, a == c, b == c)  # True True True

3.del语句和垃圾回收

  • CPython使用垃圾回收算法是引用计数的方式

先建立a,让b,c同时指向a所指向的内存此时引用计数值为3,del a之后引用计数为2,最后程序结束删除对象

 1 class A:
 2     def __init__(self, name):
 3         self.name = name
 4         print("init:" + name)
 5
 6     def __del__(self):
 7         print("del:" + self.name)
 8
 9
10 a = A("a")  # init:a
11 b = a
12 c = a
13 del a
14 c.name = "c"
15 print(b.name)  # c
16 b.name = "b"
17 print(b.name)  # b  最后执行del:b

4.一个经典错误

原文地址:https://www.cnblogs.com/zhihaospace/p/12089255.html

时间: 2024-07-29 13:49:19

第七章python对象引用、可变性和垃圾回收的相关文章

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

7.1 python变量到底是什么 #python和java中的变量本质不一样,python的变量实质上是一个指针 int str, 便利贴 a = 1 a = "abc" #1. a贴在1上面 #2. 先生成对象 然后贴便利贴 a = [1,2,3] b = a print (id(a), id(b)) print (a is b) b.append(4) print (a) --- 1642030876232 1642030876232 True [1, 2, 3, 4] 7.2

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

1.python中变量是什么? 在数学概念中,变量表示没有固定值且可以改变的数值.在计算机系统中,变量表示一段或者多段用来存储数据的内存.变量名都是指代的一个指针. 在GO语言里面,变量总是有固定的类型,变量类型决定了数据在内存中的长度存储格式. 在python中,变量进行初始化的时候可以不指定类型,那它是如何存储的?你可以将变量看成标签,比如a = 1现在将a这个便签绑定在1这个int类型的对象上面.a = “kebi”现在又将a重新绑定在”kebi“这个str类型的对象上面.这种操作只能在动

Python中深浅拷贝 垃圾回收与 super继承(六)

1 python拷贝 深拷贝,浅拷贝 与引用三者的区别 import copy a = [1, 2, 3, 4, ['a', 'b']] #原始对象 b = a #赋值,传对象的引用 c = copy.copy(a) #对象拷贝,浅拷贝 d = copy.deepcopy(a) #对象拷贝,深拷贝 a.append(5) #修改对象a a[4].append('c') #修改对象a中的['a', 'b']数组对象 print('a = ', a) print( 'b = ', b) print(

04-3 python语法入门之垃圾回收机制

[TOC] 一 引入 ? 解释器在执行到定义变量的语法时,会申请内存空间来存放变量的值,而内存的容量是有限的,这就涉及到变量值所占用内存空间的回收问题,当一个变量值没有用了(简称垃圾)就应该将其占用的内存给回收掉,那什么样的变量值是没有用的呢? ? 由于变量名是访问到变量值的唯一方式,所以当一个变量值不再关联任何变量名时,我们就无法再访问到该变量值了,该变量值就是没有用的,就应该被当成一个垃圾回收.毫无疑问,内存空间的申请与回收是非常耗费精力的事情,而且存在很大的危险性,稍有不慎就有可能引发内存

python闭包&深浅拷贝&垃圾回收&with语句

1.1 闭包 1.闭包概念 1. 在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用,这样就构成了一个闭包 2. 一般情况下,在我们认知当中,如果一个函数结束,函数的内部所有东西都会释放掉,还给内存,局部变量都会消失. 3. 但是闭包是一种特殊情况,如果外函数在结束的时候发现有自己的临时变量将来会在内部函数中用到,就把这个临时变量绑定给了内部函数,然后自己再结束.   2.闭包特点 1. 必须有一个内嵌函数 2. 内嵌函数必须引用外部函数中的变量 3

java 面向对象编程-- 第十三章 反射、类加载与垃圾回收

1.狭义JavaBean规范 Javabean必须包含一个无参数的public构造方法,方便通过反射的方式产生对象. 属性必须都是私有的. Javabean必须包含符合命名规范的get和set方法,以便访问Javabean的属性. Javabean应该是可序列化(serializable)的. 2.反射 在编译时,并不清楚应该加载哪个类.类的加载是在运行期间进行的.通过反射,可以对类进行加载.探知.自审. 可以通过对象.getClass()或者通过类名.class或者通过Class.forNam

第四章 HotSpot jvm 中的垃圾回收机制

有很多有名的Jvm,但我们最常用到的就是Oracle收购sun公司的HotSpot. HotSpot中内存被分为3个代:年轻代(young generation),年老代(old generation),持久代(permanent generation).对象最初在年轻代,年老代代理存放着是经过几次年轻代收集后仍然 live 的对象和一些可能直接被分配到年老代的大对象.持久代存放的是 JVM 认为可以帮助简化垃圾收集管理的对象,比如像类和方法的描述信息. 年轻代代内存模型:一个伊甸区(Eden)

第七章 Python异常处理

什么是异常? 顾名思义,异常就是程序因为某种原因无法正常工作了,比如缩进错误.缺少软件包.环境错误.连接超时等等都会引发异常.一个健壮的程序应该把所能预知的异常都应做相应的处理,应对一些简单的异常情况,使得更好的保证程序长时间运行.即使出了问题,也可让维护者一眼看出问题所在.因此本章节讲解的就是怎么处理异常,让你的程序更加健壮. 7.1 捕捉异常语法 try...except... try:      expression except [Except Type]:      expressio

第七章 Python 盒子:模块、包和程序

前戏部分 独立的程序 命令行参数 模块和import语句 导入模块 使用别名导入模块 导入模块的一部分 模块搜索路径 包 setdefault() 和 defaultdict()处理缺失的键 使用counter()计数 使用有序字典 OrderedDict按键排序 双端序列:栈和队列 使用 itertools 迭代代码结构 使用 pprint()友好输出