#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也一起发生了变化