代码改变世界

第六章 动态类型简介

2017-03-11 12:11  szn好色仙人  阅读(116)  评论(0编辑  收藏  举报
#1.
#A:在python中,类型属于对象而非变量名,每一个对象有两个标准头部信息:一个类型标示符,一个引用的计数器(python中的垃圾收集主要基于引用计数器)
#B:在python中,每当一个变量名被赋予一个新对象时,之前那个对象若没有被别的变量名或对象引用的话,那么其占用内存就会被释放,这种计数被称为垃圾收集
#C:在python中,变量总是一个指向对象的指针,而不是可改变的内存区域的标签,给变量赋一个新的值,并不是替换了原始的对象,而是让这个变量去引用了另一个完全不同的对象

#2.sys模块getrefcount()可以得到对象的引用次数
import sys
value = sys.getrefcount(1)          #value = 396
listTem = []
value = sys.getrefcount(listTem)    #value = 2
value = sys.getrefcount([])         #value = 1

#3.
v0 = sys.getrefcount(1)             #v0 = 397
value0 = 1
v1 = sys.getrefcount(1)             #v1 = 398
value1 = 1
v2 = sys.getrefcount(1)             #v2 = 399
value0 = 2                          #value0 = 2 value1 = 1
v3 = sys.getrefcount(1)             #v3 = 398
#上述代码:value0首先是对象1的引用,而后value1也成为对象1的引用,而后value0指向了其他对象,导致对象1的引用计数减小,但是对象1本身没有变化,所以指向对象1的value1也没有变化

listTem = [1, 2, 3]
v0 = sys.getrefcount(listTem)       #v0 = 2
listTem0 = listTem;                 #listTem0 = [1, 2, 3]
v1 = sys.getrefcount(listTem)       #v1 = 3
listTem1 = listTem;                 #listTem1 = [1, 2, 3]
v2 = sys.getrefcount(listTem)       #v2 = 4
listTem0 = 1;                       #listTem0 = 1 listTem1 = [1, 2, 3]
v3 = sys.getrefcount(listTem)       #v3 = 3
listTem1.append(10)                 #listTem1 = [1, 2, 3, 10] listTem = [1, 2, 3, 10]
#上述代码:listTem0,listTem1指向了listTem所指向的列表对象,导致listTem所指向的列表对象的引用计数增加了2次,后来listTem0指向了另一个对象,导致listTem所指向的对象的引用计数减一
#再后来listTem1改变了listTem所指向对象的内容,这就反映到了listTem上,导致listTem也一起发生了变化