Python学习6:动态类型与共享引用
2014-01-13 13:58
483 查看
在Python中变量没有固定的类型,变量只是指向想内存空间中对象的一个引用或指针,类型的概念属于对象,不属于变量
>>>a=3
>>>b=a
其内存模型如下图所示
当执行a=3时,程序首先创建int型变量3,然后让a指向3
当执行b=a时,程序让b也指向int型变量3
a和b在这里都是指向int型变量3的引用
再看一个例子
>>>list_1 =[1,2,3,4]
>>>list_2 =list_1
>>>list_2
>>>list_1[0]= 'python'
>>>list_2
result:
[1,2,3,4]
['python',2,3,4]
list_1首先指向了[1,2,3,4],然后list_2也指向了该列表(list_1和list_2指向相同的列表),当改变list_1时,list_2中的元素也发生了改变
如果你不想要这样的现象发生,需要python对象拷贝,而不是创建引用。
>>>list_1=[1,2,3,4]
>>>list_2=list_1[:]
>>>list_1[0]=11
>>> list_1
[11, 2, 3, 4]
>>> list_2
[1, 2, 3, 4]
注意:上述例子只是为了说明原理,其实python内部会缓存小整数和字符,并不会立即销毁
python动态类型
python是靠动态类型来实现以上操作的。“每一个对象都有两个标准的头部信息:一个类型标识符去标示这个对象的类型,以及一个引用的计数器,用来决定是不是可以回收这个对象” 。在内部,python通过每一个对象中的计数器来记录引用直到这个对象上的次数,一旦这个计数器被设置为零,这个对象的内存空间将自动被回收。
>>>a=3
>>>b=a
其内存模型如下图所示
当执行a=3时,程序首先创建int型变量3,然后让a指向3
当执行b=a时,程序让b也指向int型变量3
a和b在这里都是指向int型变量3的引用
再看一个例子
>>>list_1 =[1,2,3,4]
>>>list_2 =list_1
>>>list_2
>>>list_1[0]= 'python'
>>>list_2
result:
[1,2,3,4]
['python',2,3,4]
list_1首先指向了[1,2,3,4],然后list_2也指向了该列表(list_1和list_2指向相同的列表),当改变list_1时,list_2中的元素也发生了改变
如果你不想要这样的现象发生,需要python对象拷贝,而不是创建引用。
>>>list_1=[1,2,3,4]
>>>list_2=list_1[:]
>>>list_1[0]=11
>>> list_1
[11, 2, 3, 4]
>>> list_2
[1, 2, 3, 4]
注意:上述例子只是为了说明原理,其实python内部会缓存小整数和字符,并不会立即销毁
python动态类型
python是靠动态类型来实现以上操作的。“每一个对象都有两个标准的头部信息:一个类型标识符去标示这个对象的类型,以及一个引用的计数器,用来决定是不是可以回收这个对象” 。在内部,python通过每一个对象中的计数器来记录引用直到这个对象上的次数,一旦这个计数器被设置为零,这个对象的内存空间将自动被回收。
相关文章推荐
- 《Python 学习手册4th》 第六章 动态类型简介
- 学习python语言的动态类型摘要
- Python动态类型和引用
- 【Python 学习手册笔记】动态类型简介
- Python学习笔记(四):动态类型
- Python学习笔记之动态类型
- python学习笔记17(动态类型)
- python学习手册笔记--第5章--数字--第6章--动态类型
- Python学习——动态类型简介
- Python学习系列十一:动态类型
- Python学习笔记(五)Python动态类型和引用
- 【Python学习】python学习手册--第六章 动态类型简介
- python学习笔记17(动态类型)
- python学习笔记-(18)python中的动态类型(相当重要)
- Python学习笔记整理(三)Python中的动态类型简介
- Python学习笔记1--动态类型
- Python学习------ 动态类型
- python学习笔记八--动态类型
- Python3学习笔记06-循环设计、循环对象、函数对象、错误处理、动态类型
- Python学习笔记整理(三)Python中的动态类型简介