zoukankan      html  css  js  c++  java
  • Python 学习 第四篇:动态类型模型

    Python的变量不用声明,赋值之后就可以直接使用,类型是在运行过程中自动确定的,这就是动态类型模型。该模型把变量和对象设计成两个不同的实体,对象是存储数据的地方,对象的类型是由初始值自动决定的,而变量仅仅是对象的引用。变量是通用的,同一个变量名可以引用任何类型的对象。

    一,变量、对象和引用

    动态类型模型由三部分构成:变量、对象和引用。变量和类型没有任何关系,类型是对象的,变量只是引用对象而已。例如,a=3,a是变量名,Python自动创建一个内存对象,值是3,变量a自动引用对象。

    1,变量

    对于一个变量,当第一次给它赋值时,就创建了变量,并把变量关联到内存对象。之后对变量的赋值,将会改变变量引用的对象。

    从技术上来看,变量是指针类型,所谓的数据类型,是指变量引用的对象的类型,类型的概念存在于对象中,而不是变量中。

    当变量出现在表达式中时,它会被当前引用的对象所代替,无论这个对象是什么类型。

    2,对象

    从技术上讲,对象是一块内存空间,存储头部和内容。每个对象都有两个标准的头部信息:一个类型标志符用于标识对象的类型,一个计数器用于标识被应用的次数。当对用被引用的次数为0时,Python会自动回收该对象占用的内存空间。

    3,引用

    变量和对象通过引用关联在一起,在使用变量时,Python自动通过引用获取或设置对象的值。

    二,通用类型分类

    Python的核心类型,通常细分为:整数、字符串、元组、列表、字典,也可以按照操作分为整数、序列和映射,也可以按照对象是否支持原处修改,把类型分为可变类型和不可变类型。

    1,按照操作分类

    • 整数是不可变的对象,支持算术运算;
    • 集合是无序的,支持集合操作;
    • 字符串、列表和元组是序列,元素的位置是顺序的,可以按照偏移对序列进行索引和分片操作;
    • 字典是映射,元素之间没有顺序,但是通过映射来获取值,而不是通过偏移。

    2,按照可变性分类

    对象的可变性是指对象是否可以原处修改,原处修改是指对象的内存空间是否可以被修改。

    Python的类型从可变性上可以分为两类:可变类型和不可变类型,

    • 可变类型:列表、字典
    • 不可变类型: 整数,字符串、元组,集合

    可变对象可以在原处被修改,不可变对象一旦创建成功,就保持不变。

    三,赋值和共享引用

    在使用赋值符号(=)时,如果变量对变量“赋值”,产生共享引用,两个变量引用同一个对象;如果是使用对象对变量赋值,产生的结果是创建新的对象,同时使变量引用新的对象。

    例如,把变量赋值给变量时,变量之间存在共享引用,也就是说,多个变量名引用同一个对象,

    a=3
    b=a

    此时,变量a和b同时指向一个对象。变量名赋值给变量名,使得两个变量引用相同的对象。

    当把对象赋值给变量时,并不是替换了原始的对象,而是让这个变量去引用另一个完全不同的对象。

    例如,当变量重新赋值时,a='abc',变量a引用的是另一处内存空间。此时,b是3,而a是abc。

    a='abc'

    1,共享引用和可原处修改

    当共享引用的对象是可变类型时,对可变对象的修改,会反应到共享引用的变量上。

    例如,变量l1和l2是共享引用,引用的对象是列表,而列表支持原处修改:

    l1=[1,2,3]
    l2=l1

    当修改变量l1引用的对象的值时,变量l1和l2引用的还是同一个内存空间,l1和l2的值是相同的。

    l1[0]=5

    2,共享引用和相等

    ==和is是不同的“相等”比较,前者是指值相等,后者是指对象的同一性(同一个对象)。

    例如,a和b既是值相等,也是对象同一的。

    a=[1,2]
    b=a

    例如,a和b是值相等,但是对象不是同一个,这说明,可变类型的常量的缓存是不可复用的。

    a=[1,2]
    b=[1,2]

    例如,x和y既是值相等,也是对象同一的,这说明,不可变类型的常量的缓存是复用的。

    x=1
    y=1

    四,深拷贝和浅拷贝

    浅拷贝是指引用的拷贝,深拷贝是指对象的拷贝。在Python中,浅拷贝存在于下面三种情况:

    • 共享引用是浅拷贝,两个变量引用同一个对象。
    • 由于Python会复用不可变对象,因此,不可变对象的赋值都是浅拷贝。
    • 赋值生成的是浅拷贝。

    深拷贝是指值相同的不同对象,因此,== 运算的结果是True,而 i s运算的结果是False,例如,a和b的值相同,但是引用的对象不同。

    a=[1,2]
    b=[1,2]

    对a进行修改,不会引用b的值,列表的深拷贝,也可以通过list.copy()函数来实现。

    >>> a=[1,2]
    >>> b=a.copy()
    >>> a==b
    True
    >>> a is b
    False 

    对于可变类型的深拷贝:

    • 列表类型有:list.copy(),list[:],list(list_var)
    • 字典类型:dict.copy()
    • copy标准库模块中
    import copy
    x=copy.deepcopy(y)

    参考文档:

  • 相关阅读:
    【python-opencv】opencv基础操作之一
    【胎教】做AI的基础,开始学习。
    【实习】博士生找实习的囧事之其一
    【经验】CS
    【keras】用tensorboard监视CNN每一层的输出
    【算法】背包九讲
    【计算机网络】大数据 云计算 人工智能
    【算法】shortest distance
    【git】git hello world
    【算法】深度优先 马走日 Hamilton routes
  • 原文地址:https://www.cnblogs.com/ljhdo/p/10104844.html
Copyright © 2011-2022 走看看