python动态类型

python是动态语言。不需要事先声明变量类型,同一变量可以被赋值为不同的对象类型。

变量、对象、引用

  • 变量创建
    python的变量不需要声明,当代码第一次给其赋值时就创建它。

  • 变量赋值
    举例说明,赋值语句 “a = 3”。一般而言赋值过程如下:

    1. 创建被赋值的对象,即在内存中开辟一块空间,用于保存对象的信息。本例来说是一个整数对象3.
    2. 如果变量名之前没有被定义过,创建变量名,’a’。如果变量名存在,则跳过。
    3. 建立变量名和被赋值对象之间的引用。引用类似于c语言的指针。
      以上过程适用于所有的变量赋值。
  • 变量类型
    变量本身不包含任何类型约束信息,类型的概念存在于它引用的对象中而不是变量名中。

  • 变量使用
    当变量出现在表达式中时,它会马上被引用的对象所代替。所有的变量在使用前必须被赋值,使用未赋值的变量会引起“NameError”异常(变量必须先被创建才能使用)

  • 对象
    每个对象有两个标准的头部信息:标识对象类型的类型标志符,一个引用计数器。一个对象可能同时被多个变量名引用,引用计数器记录了对象被引用的次数。对于大部分的对象而言,当引用计数器的值为0时,对象所在的内存空间会被回收。

  • 共享引用
    多个变量名同时引用同一个对象。

python的内置核心对象类型

不可变类型

不可变类型,对象一旦创建不可修改。整数类型 int 、浮点数类型 float、复数类型 complex、字符串类型 str、元祖类型 tuple 、集合类型 set,都属于不可变类型。下面通过变量赋值的过程理解型不可变对象:

a = 1 #建立变量a到对象1的引用
b = a #建立变量b到对象1的引用, 共享引用
a = 2 #因为int类型的对象1不可修改,所以新建对象2,并且建立变量a到它的引用
      #现在变量a、b分别引用不同的对象。

 

过程如图:

Alt text

可变类型

可变类型指对象可原地修改的类型。比较典型的:列表类型 list、字典类型 dict。
以list为例,list是任意对象的有序集合,如下图所示:

Alt text
list对象中每个元素都是一个对象引用。通俗理解,list对象的元素有点类似变量,同样可更改。

对于可变对象,如果存在共享引用,那么修改对象会同时影响引用该实例的所有变量。

>>> lst = [1,2,3]

>>> lst2 = lst

>>> lst is lst2 #is测试两个变量是否引用同一对象
True

>>> lst, lst2
([1, 2, 3], [1, 2, 3])

>>> lst[0] = 10
>>> lst,lst2
([10, 2, 3], [10, 2, 3])

 

 

posted @ 2017-09-21 18:03  Wadirum  阅读(329)  评论(0编辑  收藏  举报