转帖:文章出处:http://hi.baidu.com/buptyoyo/blog/item/224e5fa6eab1a4e69052eecf.html
与C、C++等静态类型绑定的语言不同,Python的类型是动态绑定的。也就是你在使用一个变量的时候是不必对它的类型进行声明的。这是Python的强大之处。它使得Python可以灵活的操作各种不同类型的变量。 它背后的机制是什么呢?掌握几个概念,就可以明白。
1. 名字(name )与对象(object ) 先说说什么是对象,对象就是系统分配的一块内存,这个内存可以有足够的空间表示希望代表的Value以及一些与该对象有关的信息标记。 名字的作用就是用来指示一个对象,使我们通过名字就可以对对象进行操作。 这就像生活中,每一个人就相当于一个对象,占据一定的空间。而每个人都要有个名字,这个名字的作用只是起到一个桥梁作用,当我们听到一个名字时可以联系到名字代表的那个“真正的”人。
2. Python 里的对象 Python 里的对象毫无疑问也是一块内存,它保存的信息除了对象本身代表的 Value 还有类型,所以说在 Python 中类型是与对象绑定的。
3. 引用 所谓引用就是将一个名字与一个对象联系起来。就像一个新生儿,父母想出了一个名字,并将这个名字赋予他,于是名字与孩子之间就对应起来,这就是引用。
4. Python 的赋值机制 Python中的赋值过程可以分成三步,以a = 3为例: A.创建一个对象用来表示3 B.起一个名字a(如果之前没有用过这个名字) C.将名字a与对象联系起来。 Ok,赋值完毕。 了解了这几个概念,我们可以明白,在python中一个变量并没有类型,它的类型完全取决于它所指向的对象。 >>> a = 1 a代表的类型就是整数,因为它是对一个整型数对象1的引用。 >>> a = “hello world”,则a代表的类型就是字符串,因为它是对字符串类型对象”hello world”的引用。 Python的这种动态类型绑定与赋值机制十分灵活。但也可能带来一定风险。例如: >>> a = [1, 2, 3] >>> b = a >>> a[0] = 4 >>> b [4, 2, 3] 列表是一系列对象的集合。名字a是对列表对象[1, 2, 3]的引用,b = a因此b也是对[1, 2, 3]的引用,即a和b指向同一个对象,这样当a[0]被赋值为4时,相当于列表对象被改变了,即b所对应的对象被改变了。如果希望b的对象不被改变,可以 使用copy.deepcopy()。系统将复制一个与a所指向的对象值相同但处于不同内存空间的新对象,并将名字b与其关联。