学习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

>>>

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。