首页 > 代码库 > 学习python语言的动态类型摘要
学习python语言的动态类型摘要
变量只是在一个特定的时间点对某一特定类型对象的引用,当变量出现在表达式中时,它会马上被当前引用的对象所代替,也就是说,在一个程序,同一个变量名可以引用任何类型的对象。而不受限于它最初的引用。类型属于对象,而不是属于变量,给一个变量赋一个新值,并不是替换了原始的对象,而是让这个变量去引用完全不同的一个对象。
>>> a=11
>>> type(a)
<class ‘int‘>
>>> a=‘abc‘
>>> type(a)
<class ‘str‘>
>>>
变量和对象保存在内存中的不同部分,通过连接(赋值=等)相关联,在内部,变量事实上是到对象内存空间的一个指针,它们这具连接关系也称为“引用”
而对于对象,在系统内部会分配一块内存,有足够的空间去表示它们所代表的值,每个对象都有两个标准的头部信息:一个类型标志符,一个引用计数器,后者用来决定是不是可以回收这个对象
对象的垃圾收集
每当一个变量名审美观点赋予了一个新的对象,这前的那个对象占用的空间就会被回收(如果它没有被其它的变量名或对象所引用的话),原对象的空间自动被放入自由内存空间池,等待后来的象使用
共享引用
多个变量名引用了同一个对象,如下面的例子,变量 a和b都是引用常量表达式创建的对象3,而再次给变量a赋值时,b引用的值没有跟着改变
>>> a=3
>>> b=a
>>> type(b)
<class ‘int‘>
>>> a=4
>>> b
3
共享引用和在原处修改
有一点要注意的,因为list是请允许在原处修改的,因此,如果两个变量引用的一同一个列表对象,那么,通过其中一个变量去修改列表,都会影响到另一个变量的引引值
>>> l1 = [1,b,3]
>>> l2= l1
>>> l1[1]=‘c‘
>>> l2
[1, ‘c‘, 3]
如果要避免这个情况发现,需要使用拷贝对象,对于列表,可以使用标准库的copy模块,也可以使用从头到尾的分片,这样,两个变量就指向了不同的内存区域了
>>> L1=[1,2,4]
>>> L2=L1[:]
>>> L1[0]=2
>>> L1
[2, 2, 4]
>>> L2
[1, 2, 4]
>>>
而对于字典和集合,应该使用X.copy()的方式调用,可以直接在原处改变的对象有列表、字典、以及一些通过class定义的对象
>>> import copy
>>> L3=copy.copy(L1)
>>> L3
[2, 2, 4]
>>>
共享引用和相等
对判定两个变量是不是相等,可以使用“==”和“is”,但两都有不同的意思,“==”是指变量所引用的对象值相等,而“is” 则是指两个变量引用的是同一个对象,is只是比较实现引用的指针
>>> L=[1,2,3]
>>> M=[1,2,3]
>>> L==M
True
>>> L is M
False
>>>
但python为了优化执行速度,对于不可变的对象,如数字、字符串对像,会有一种缓存机制,同一值的对象只生成一个对象内存空间,也就是说,对变量所引用的对象(仅限数字、字符串、元组这类不可变的对象)值相等时,这个对象是同一个对象,可以通sys 模块里的getrefcount()可查看某个对象被引用的次数
>>> a=5
>>> b=5
>>> a == b
True
>>> a is b
True
>>> str1= "hello"
>>> str2= "hello"
>>> str1 == str2
True
>>> str1 is str2
True
>>>
>>> import sys
>>> sys.getrefcount("hello")
4
>>> str3="hello"
>>> sys.getrefcount("hello")
5
>>>
学习python语言的动态类型摘要