码迷,mamicode.com
首页 > 编程语言 > 详细

学习python语言的动态类型摘要

时间:2014-11-16 18:56:38      阅读:226      评论:0      收藏:0      [点我收藏+]

标签:style   color   ar   os   使用   sp   for   strong   on   

变量只是在一个特定的时间点对某一特定类型对象的引用,当变量出现在表达式中时,它会马上被当前引用的对象所代替,也就是说,在一个程序,同一个变量名可以引用任何类型的对象。而不受限于它最初的引用。类型属于对象,而不是属于变量,给一个变量赋一个新值,并不是替换了原始的对象,而是让这个变量去引用完全不同的一个对象。

>>> 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语言的动态类型摘要

标签:style   color   ar   os   使用   sp   for   strong   on   

原文地址:http://my.oschina.net/u/1590519/blog/345315

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!