首页 > 代码库 > Python的动态类型

Python的动态类型

动态类型:                                                     
  在python中,类型是在运行过程中自动决定的,而不是通过代码声明的。
变量:                                                                                    
  变量是一个系统表的元素,拥有指向对象的连接的空间
  python中,类型的概念是存在于对象中的,而不是变量中,变量是通用的。
变量的使用:                                                                         
  当变量出现在表达式中时,它会马上被当前引用的对象所代替,无论这个对象是什么类型。
  并且所有变量使用前必须先赋值。

  例子:
      a=3
    1.分配一块内存来表示对象3;
    2.创建一个变量a;
    3.将变量和对象3连接起来;
对象:                                                                                
  1.对象时被分配的一块内存,有足够的空间去表现他们所代表的值。
  2.对象=值+头部信息。头部信息有两个:一个是类型标志符,一个是引用的计数器。
  3.对于小的整数和字符串,Python会缓存并复用(即创建一个42,如果对象42的引用计数器为0了,它不会马上回收垃圾,而是短暂存在一个地方,等待其他变量引用)
   对象的垃圾回收机制:
  当一个对象身上的引用计数器为0时,会被自动回收

共享引用:                                                                           
  在Python中,给一个变量赋新值,并不是替换了原始的对象,而是让这个变量去引用另一个新对象。
  不可变类型:
      a=3
      b=a
      a=a+2
    1.创建对象3,变量a引用对象3;
    2.正如前面所说,当变量出现在表达式中时,它会马上被当前引用的对象所代替,无论这个对象是什么类型。
    所以b=a时,直接替换成b=3,此时a和b共同引用了对象3;
    3.同2,a=a+2直接看成a=3+2=5,此时a引用了新的对象5,而b还是引用对象3.
  可变类型
      a1=[1,2,3]
      a2=a1
      a1[0]=4
    执行a1[0]=4这句时,因为列表是可变的,所以对象[1,2,3]直接在原处修改成[4,2,3],此时a1,a2的应用并没有变,
    所以a1修改,a2也变了。
    (如果不想要这种现象发生,就需要Python拷贝对象,而不是创建引用,比如从头到尾的分片a2=a1[:],(如果是字典就用对象.copy()),
    此时a1改变,a2还不变,因为a2=a1[:],a1,a2 并不是引用通一份对象,而是另外复制一份新的对象[1,2,3],然后让a2引用它
    )

Python的动态类型