您的位置:首页 > 编程语言 > Python开发

Python学习笔记之动态类型

2015-08-23 11:32 656 查看
一 变量、对象和引用

在Python中,变量名和对象是独立分开的,在赋值的过程中,通过引用将变量索引到相应的对象中。

a='Hello World!'


从概念上讲,上述语句的创建至少经过三个过程:

1.辟出一块内存来存储对象 Hello World。

2.变量名a第一次出现时,创建它

3.通过引用,将a与对象 Hello World连接

二 类型属于对象

a=123
a='hello world!'


较之C语言中的变量需要先声明后定义这些约束,Python语言无须对变量的类型做约束,因为实际上类型(type)属于对象。举例来说,如上述的两行代码,在C语言中同一个变量名被先后赋予不同类型的数据,这完全不可行,而在Python中之所以可行,并非程序改变了变量a的数据类型和值,而是改变了变量a的引用。a原先是通过引用指向对象123,而后在将其指向对象‘hello world’ 而已。即变量所指的对象是什么类型,变量就是什么类型。


三 对象垃圾收集(Garbage-Collected)

a=123
a='hello world!'
a=1.23


在Python中,每当一个变量被赋予新的对象时,之前的对象所占用的空间就会被回收,对象的引用值在此过程中被逐渐的丢弃。如上述的三行代码中,当变量a被赋予‘hello world’时,对象123所占用的内存则自动被回收放入自由内存空间。
这就意味着在Python中任意使用对象而不需要对其作任何释放内存空间的考虑,因为Python会自动清除已经不需要使用到的对象的内存空间。


四 共享引用

a=123
b=a
a='hello world!'


上述代码中的第二行的作用是将变量b指向对象123,这样即使在第三行变量a改变赋值,指向对象‘hello world!’,b的值也是不会改变的。


五 共享引用和在原处修改

a=[1,2,3]
b=a
a='hello world!'


同样的,上边对列表a做对象的直接改变,b所指的对象[1,2,3]并没有发生改变,所以b的值是没有发生改变的,但是代码如如下情况的话,结果则有所不同


a=[1,2,3]
b=a
a[0]='hello world!'


这里并不是改变a,而是改变了a所指引的对象的第一个元素值,这样就改变的原本的对象值,那么原先所有指向该对象的变量的值都会跟着改变。
这样就引出另外一个问题,假如要对某个变量做一份拷贝而且不随原先的变量所指的对象的改变而发生改变时,该如何。其实就是新辟出另外一个内存空间来储存拷贝的数据,有几种方法:


a=[1,2,3]
b=a[:]
b=copy.copy(a)
b=copy.deepcopy(a)


三种方法的应用场合和结果根据对象类型有所不同。第一种采用切片的方法只适用于序列类型(包括列表、字符串,元组等)。后两种方法则适用于任何类型,在运用于字典或者集合(Sets)类型时,如果没有嵌套(nesting)的存在,则两种的结果是一致的,假如字典或集合中存在嵌套而且想要把嵌套中的数据也一并完整拷贝,则只能使用copy.deepcopy()。

六 共享引用和相等

a=[1,2,3]
b=a
b==a        #true
b is a      #true


‘==’是相等操作符,判断两个被引用的对象的值是否相等,而’is ’ 操作符则作对象同一性判断,也就是说前者即使是不同对象,只要对象的值相等,则返回true的结果;而后者则是判断变量是否指向同一对象,只有指向同一对象才返回true的结果。

更多的具体可以参照learning Python的第六章

Reference:

http://pan.baidu.com/s/1EcrjX
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息