Pre:
Question1:
1 | 3 a = |
我们并没有显示声明a
是个变量而且它的类型为int
那么python是怎么知道a
是个变量而且知道它的类型的呢?
Question2:
执行以下代码
1 | 3 a = |
a 的类型怎么发生了变化?
以上2个问题涉及到python的一个重要的概念:动态类型(dynamic typing)
要搞清楚动态类型之前要先搞清楚3个重要的概念及其关系:
-
Object 对象
-
Reference 引用
-
Variable 变量
三个重要的概念:
Object:
对象是我们分配的内存块,有足够的空间去存储数据.
所以dict
、list
、string
这些对象在内存中都是一段01序列
除了告诉解释器它是多少位后,它还要声明类型.
所以每个对象都有一个标准头部信息:类型标识符type designator
来表示对象的类型.
Reference:
由于我们不能直接接触到存在内存中的对象,能操作的是变量名,所以我们要将变量和对象建立一个关系:引用reference
python的引用跟C语言的指针很像,因为引用就是用指针实现的.
Variable:
建立引用关系之后,我们就可以用变量名来操控对象了.
所以,变量是对对象的引用的一个符号名。
三者的关系:
变量和对象存储在内存的不同部分中,并链接了起来(由指针).
实际就是,执行一个赋值语句的时候,python会做三件事:
-
创建一个
对象
代表数值3 -
创建一个
变量名a
-
将
对象3
和变量a
关联起来
共享引用
1 | 3 a = |
多个变量名同时指向同一个对象,称为共享引用Shared References
.
1 | 3 a = |
变量a
改变了指向,指向到了'spam'对象
而变量b
还是指向原来的3对象
,所以值没有改变
refs:
-
《Studing Learning Python》