Python笔记(四)-动态类型

By Mac小兔

概述

  • 变量名没有类型
  • 变量需赋值;在赋值时创建
  • 每一个对象都有两个标准的头部信息:
    • 一个类型标志符去标志这个对象的类型
    • 一个引用的计数器

对象

  • 类型属于对象,而不是变量

对象垃圾收集

原理

它在每个对象中保持了一个计数器,计数器记录了当前指向该对象的引用的数目。一旦(并精确到统一时间)这个计数器被设置为零,这个对象的内存空间就会自动回收。

共享引用和相等检查

多个变量名引用了同一个对象

  • 像列表这样的类型如果共享引用,那么对位置的修改,可能会影响其他变量的使用;
  • 可以使用拷贝一个列表的方法,避免共享引用引起的数据改变问题
  • 拷贝列表的方法:

    //方法一
    >>> L2 = L1[:]
    //方法二
    >>> import copy
    >>> X = copy.copy(Y)
    >>> X = copy.deepcopy(Y)   // deep copy,copy all nested parts
    
  • 可变对象包括了列表,字典以及通过class语句定义的对象,可以通过copy对象避免值被更改。

相等检查

  • ==操作符:测试两个被引用的对象是否有相同的值
  • is操作符:检查对象的同一性,更严格形式的相等测试,

    >>> L = {1,2,3}
    >>> M = {1,2,3}
    >>> L == M
    True
    >>> L is M
    False
    
  • python中小的整数和字符串被缓存并复用了

    >>> X = 42
    >>> Y = 42
    >>> X == Y 
    True
    >>> X is Y
    True
    

查询对象引用次数

sys模块中getrefcount函数:返回对象的引用次数.

>>> import sys 
>>> sys.getrefcount(42)
Link.