与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,赋值完毕。
![](https://p-blog.csdn.net/images/p_blog_csdn_net/mwsong/name-obj.bmp)
了解了这几个概念,我们可以明白,在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与其关联。