Python 动态类型定义

来源:互联网 发布:android 网络测速代码 编辑:程序博客网 时间:2024/06/07 22:29

如果你有静态编译类型语言c,c++,java的背景,你也许有些困惑。我们在使用变量时,都没有声明变量的存在和类型,并且变量还可以工作。例如,在交互会话模式或是程序文件中,a = 3时,python怎样知道a代表的是一个int呢?python是怎么知道a是什么的?

如果你有这样的疑惑,就已经进入了python的东条类型模型的领域。


动态类型以及由它提供的多态性,这个概念无疑是Python语言的简洁性和灵活性的基础。

在Python中,并不会声明脚本中使用的对象的确切的类型。事实上,程序甚至可以不在意特定的类型;相反地,它们能够自然地适用于更广泛的场景下,因为动态类型是Python语言灵活性的根源。

变量创建
    一个变量,例如a,当代码第一次给她赋值时就被创建了,之后的赋值将会改变已创建的变量名的值。从技术上来讲,python在代码欲行之前先检测变量名,可以当成是最初的赋值创建变量

变量类型

    变量用于不会有任何的和它关联的类型信息或约束。类型的概念是存在于对象中而不是变量中。变量原本是通用的,她只是在一个特定的时间点,简单地引用了一个特定的对象而已

变量使用
    当变量出现在表达式中时,它会马上被当成引用的对象所代替,无论这个对象是什么类型,此外,所有的变量必须在其使用前明确地赋值,使用未赋值的变量会产生错误。


从概念上来说,python会执行三个不同的步骤去完成这个请求:

1. 创建一个对象代表值3
2. 创建一个变量a,如果它还没有创建的话

3. 将变量与新的对象3连接(引用,指针指向)

如图.1 :所示的是一个在python中的内部结构。变量和对象保存在内存的不同部门,并通过连接相关联。变量总是连接到对象,并且绝不会连接到其他的变量上,但大部分的对象可以连接到其他的对象(例如:一个列表对象能够连接到它所包含的对象)

图1

如图.1:变量名和对象,在运行a=3后,变量a变成对象3的引用,在内部,变量事实上是到对象内存空间的一个指针

在python中从变量到对象的连接称为引用,也就是说,引用是一种关系,以内存中的指针的形式显示。一旦变量被使用(引用),python自动跟随这个变量到对象的连接。


  • 变量是一个系统表的元素,拥有指向对象的连接的空间
  • 对象是被分配的一块内存,有足够的空间去表现他们所代表的值
  • 引用是自动形成的从变量到对象的指针


至少从概念上来讲,在脚本中,每一次用过运行一个表达式生成一个新的值,python都会创建一个对象去表现这个值。从内部来看,作为一中优化,python缓存了不变的对象并对其进行复用。例如,小的int和字符串(每一个0都不是一快真正的新内存快,后面我会给大家介绍)。但是,从逻辑的角度来看,这工作起来就像每一个表达式结构的值都是一个不同的对象,每一个对象都有不同的内存。

从技术来讲,对象有更复杂的结构而不仅仅是有足够的空间去表现她的值那么简单。每一个对象都有两个标准的头部信息:一个类型标识符去标示这个对象的类型,以及一个引用的计数器,用来决定是不是可以回收这个对象。