对象
内存中存储数据的实体, Python中一切皆是对象, 每个对象都包含一个头部信息(类型标识符和引用计数器)
对象有类型
变量
对对象的引用, 通过变量指针引用对象
x = "blue"
y = "green"
z = x
第一句指令, 在堆中创建str对象, 文本内容为blue,同时还创建变量名为x的对象引用, x引用的就是这个str对象
第二句指令, 创建变量y指向str对象
第三句指令, 创建变量z新对象引用, 并将其指向对象引用x指向相同对象
类型
变量名没有类型.类型属于对象(因为变量引用对象.所以类型随对象)
变量引用什么类型对象, 变量就是那种类型
- 查看地址
id()
id()返回对象唯一标识符, 即对象地址
a = 1
# 1855069317424
id(a)
- 引用所指判断
通过is进行引用所指判断.is是用来判断两个引用所指对象是否相同
整数
a = 1
b = 1
# True
a is b
短字符串
a = "good"
b = "good"
# True
a is b
长字符串
a = "very good"
b = "very good"
# False
a is b
列表
a = []
b = []
# False
a is b
运行结果可知,
(1) python缓存了整数和短字符串, 因此每个对象在内存中只存有一份, 引用所指对象相同,即使使用赋值语句.也只是创造新引用, 而不是对象本身
(2) python没有缓存长字符串、列表及其他对象, 可以由多个相同对象,可以使用赋值语句创建出新对象
引用计数
python通过引用计数来保存内存中变量追踪, 即记录该对象被其他使用对象引用次数.
python中有个内部跟踪变量叫做引用计数器,每个变量有多少个引用.简称引用计数
当某个对象引用计数为0时.就列入了垃圾回收队列
- 查看对象引用计数
sys.getrefcount()
普通引用
使用某个引用作为参数传递给getrefcount()时, 参数实际上创建了一个临时引用, 因此结果会比期望多1
import sys
a = [1, 2, 3]
# 2
print(sys.getrefcount(a))
b = a
# 3
print(sys.getrefcount(a))
# 3
print(sys.getrefcount(b))
# 删除b引用
del b
# 2
print(sys.getrefcount(a))
垃圾回收
当Python某个对象引用计数降为0时.说明没有任何引用指向该对象.该对象就成为要被回收的垃圾
比如某个新建对象.被分配给某个引用, 对象引用计数变为1. 若引用被删除.对象引用计数为0.那么该对象就可以被垃圾回收
下篇go语法