0%

Python-dynamic typing

Pre:

Question1:

1
2
3
4
>>> a = 3
>>> print type(a)

<type 'int'>

我们并没有显示声明a是个变量而且它的类型为int

那么python是怎么知道a是个变量而且知道它的类型的呢?


Question2:

执行以下代码

1
2
3
4
5
6
>>> a = 3
>>> a
3
>>> a = 'string'
>>> a
'string'

a 的类型怎么发生了变化?


以上2个问题涉及到python的一个重要的概念:动态类型(dynamic typing)

要搞清楚动态类型之前要先搞清楚3个重要的概念及其关系:

  • Object 对象

  • Reference 引用

  • Variable 变量


三个重要的概念:

Object:

对象是我们分配的内存块,有足够的空间去存储数据.

所以dictliststring这些对象在内存中都是一段01序列

除了告诉解释器它是多少位后,它还要声明类型.

所以每个对象都有一个标准头部信息:类型标识符type designator来表示对象的类型.


Reference:

由于我们不能直接接触到存在内存中的对象,能操作的是变量名,所以我们要将变量和对象建立一个关系:引用reference

python的引用跟C语言的指针很像,因为引用就是用指针实现的.


Variable:

建立引用关系之后,我们就可以用变量名来操控对象了.

所以,变量是对对象的引用的一个符号名。


三者的关系:

变量和对象存储在内存的不同部分中,并链接了起来(由指针).

实际就是,执行一个赋值语句的时候,python会做三件事:

  1. 创建一个对象代表数值3

  2. 创建一个变量名a

  3. 对象3变量a关联起来


共享引用

1
2
>>> a = 3
>>> b = a

多个变量名同时指向同一个对象,称为共享引用Shared References.

1
2
3
>>> a = 3
>>> b = a
>>> a = 'spam'

变量a 改变了指向,指向到了'spam'对象

变量b还是指向原来的3对象,所以值没有改变


refs: