回顾第五章,学习了关于数值数据类型的一些运算和相关处理函数。
比如判断浮点数的小数部分是否为0(a.is_integer())、floor除法和截断除法(math.trunc(-2.5))的不同、两种列表的切片使用方法、运算的优先级排名、多态的理解(如'+'运算符号的操作对象为数值和字符串时,运算方式不同)。
现在学习第六章,动态类型简介
1.类似多态的概念,python中变量的使用无须提前声明,根据赋值的数据类型来确定变量的数据类型。
2.数据类型也是对象,变量使用前必须进行数据类型对象的初始化。
3.变量重新赋值,意味着重新进行数据类型对象的初始化。
引用:
1.在python中从变量到对象的连接称作引用;
2.引用是一种关系,以内存中指针的形式实现。
对象:
1.python分配的一块内存,有足够的空间去表示它们的值。
2.每个对象都有两个标准的头信息,一个为类型标志符(标识对象类型),一个为引用计数器(用来决定是不是可以回收这个对象)。
循环引用
>>>a = [1,2,3]
>>>a
[1,2,3]
>>>a.append(a) #列表引用自身,这样的话,对象[1,2,3]的引用计数器不会为0,即不会被清除,被特别对待
[1,2,3,[...]]
>>>a[3][3][2]
3
共享引用和拷贝
1.当共享引用的对象为不可变对象(数值、字符串等),共享同一个引用的变量改变引用后,其他引用这个对象的变量不会发生改变。
2.当共享引用的对象为可变对象(列表等),共享同一个引用的变量通过对象的方法来进行值的改变,将改变其他引用这个对象的变量的值,因为它使用的是共享对象的方法,改变的是对象自身,而不是改变的引用关系。
3.如果不想共享引用对象,可以使用列表的切片方法得到的值再用来赋值,此时环境为列表切片得到的值再分配一个内存,它表示一个新的数据对象。
4.拷贝(针对含列表的字典和元组),如:
>>>b = {'a':[1,2,3]}
>>>import copy
>>>c = copy.copy(b) #通用拷贝,仅拷贝了引用
>>>d = copy.deepcopy(b) #深度拷贝,即拷贝了引用,又拷贝的值。
>>>b['a'][0] = 4
>>>b
{'a':[4,2,3]}
>>>c #仅拷贝了引用,引用的对象的值改变,它的值也改变
{'a':[4,2,3]}
>>>d #深度拷贝,把值也拷贝下来了,不随原始的引用的对象的值改变而改变
{'a':[1,2,3]}
动态类型是python多态的根本