动态类型以及由它提供的多态性,这些概念是Python简洁灵活的基础。
a = 3
Python会执行上不同的步骤去完成这个请求:
1. 创建一个对象来代表值3
2. 创建一个变量a, 如果它还没有创建的话
3.将变量与新的对象3相连接
变量是一个系统表的元素,拥有指向对象的连接的空间
对象是分配的一块内存,有足够的空间去表示他们所代表的值
引用是字典形成的从变量到对象的指针
每个对象都有两个标准的头部信息,一个类型标志符去标识这个对象的类型,一个引用计数器,用来决定是不是可以回收这个对象。
类型属于对象,而不是变量。Python中的类型是与对象相关联的,而不是和变量关联。
对象的垃圾回收:每个对象中保持了一个计数器,计数器记录了当前指向该对象的引用的数目,一旦这个计数器被设置为0,这个对象的内存空间就会自动回收。
共享引用:
共享引用在原处修改:
如对列表里面某些值的修改会改变列表对象,但不会生成一个新的列表对象,那么引用不会修改,指向该对象的所有变量都会跟着改变。如果这是你预期的,ok的,如果不想要这种结果,可以copy对象从而建立了新的引用,操作就不会互相影响。
>>> l1=[1,2,3]
>>> l2=l1
>>> l1[0]=8
>>> l1
[8, 2, 3]
>>> l2
[8, 2, 3]
共享引用和相等:
Python缓存并复用小的整数和小的字符串。由于整数和字符串为不可变对象,如果更改变量,定会指向新的对象,不会影响当前的引用。
x=43;x='shrubbery'
这里的对象43也许并不会被回收,而会保存在一个系统表中,等待下一次被使用。
Python中有两种方法检查是否相等: ==判断值相等,is判断是否为同一个对象
>>> l1 = [1,2,3]
>>> l2 = l1
>>> l1==l2 # 值相等
True
>>> l1 is l2 # 引用一样的对象
True
>>> l3 = [2,3,4]
>>> l4 = [2,3,4]
>>> l3 == l4
True
>>> l3 is l4 #引用不同的对象
False
>>> a = 3
>>> b = 3
>>> a == b
True
>>> a is b # 结果告诉我们a,b引用了相同的对象,因为小的整数和字符串被缓存并复用了
True
Learning Python, Fourth Edition, by Mark Lutz.