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是共享引用,引用的对象是列表,而列表支持原处修改:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
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()函数来实现。

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
>>> 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教程:动态类型模型相关推荐

  1. python变量类型是动态的_Python 学习 第四篇:动态类型模型

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

  2. python是动态类型语言、变量不需要显示声明类型_【IT专家】第3章 Python基础

    第 3 章 Python 基础 2017/12/13 0 3-1 .标识符.为什么 python 中不需要变量名和变量类型声明? python 语言是动态的.强类型语言,一言以蔽之! 动态编译语言特点 ...

  3. python教程list类型_Python数据类型之list相关常用操作

    列表:在其他编程语言中称为"数组",是一种基本的数据结构类型. 关于列表的问题: 列表中元素使如何存储的? 元素其实是内存地址,指向真正的元素,因为元素重复的时候,可以重复指向(省 ...

  4. 《Abaqus GUI程序开发指南(Python语言)》——2.5 动态类型简介

    本节书摘来自异步社区<Abaqus GUI程序开发指南(Python语言)>一书中的第2章,第2.5节,作者: 贾利勇 , 富琛阳子 , 贺高 , 周正光 更多章节内容可以访问云栖社区&q ...

  5. python变量类型是动态的_【Python】python动态类型

    在python中,省去了变量声明的过程,在引用变量时,往往一个简单的赋值语句就同时完成了,声明变量类型,变量定义和关联的过程,那么python的变量到底是怎样完成定义的呢? 动态类型 python使用 ...

  6. python动态类型是如何实现的_Python 的动态类型系统

    Python 与 ABC 的一个重要区别在于其类型系统. ABC 采用静态类型,编译器会检查程序中的变量类型是否保持一致,如果不一致,程序就无法运行.并且,ABC与当时大多数静态语言不同,采用的是类型 ...

  7. python 动态类型_动态类型(Dynamic type)

    在学习更复杂的对象类型之前,先掌握python的动态类型这一概念,是十分必要的.动态类型以及它提供的多态性是python语言简洁性和灵活性的基础. -------------------------- ...

  8. python 动态类型性能_动态且强类型的Python

    参考自 类型系统 强类型:偏向于不容忍隐式类型转换.譬如说haskell的int就不能变成double 弱类型:偏向于容忍隐式类型转换.譬如说C语言的int可以变成double 静态类型:编译的时候就 ...

  9. python typing optional_python类型检测最终指南--Typing模块的使用

    正文共:30429 字 预计阅读时间:76分钟 原文链接:https://realpython.com/python-type-checking/ 作者:Geir Arne Hjelle 译者:陈祥安 ...

最新文章

  1. 作为一个Linux/Unix程序员有哪些要求
  2. select 语句的执行顺序
  3. linux主设备编号从0到多少,Linux驱动开发之主设备号找驱动,次设备号找设备
  4. llinux基本操作
  5. 各种Camera,总有一款适合你(二)
  6. 一:(1.4)了解MVC之区域
  7. 服务器内存型号与频率,一张图看懂如何选择DDR4内存的频率和容量
  8. VS2017 提示警告 IDE0006
  9. STM32工作笔记005---STM32芯片解读
  10. LeetCode 5354. 通知所有员工所需的时间
  11. 状压DP【洛谷P1896】 [SCOI2005]互不侵犯
  12. GitKraKenSetup工具——小章鱼
  13. Java web项目目录结构以及作用详解
  14. Firefox插件Xmarks的使用方法
  15. 正式赛1006 子序列计数
  16. Golang线程池gpool
  17. 真香!用 4K 高清显示器写代码!(包邮送一台)
  18. 怎么调出全局搜索_华为手机怎么设置全局搜索,怎么开启以及怎么关闭
  19. 在武汉火车站转车需要出现吗_武汉火车站可以在站内换乘哪些站 武汉地铁6号线和1号线/13号线换乘...
  20. 作文未来的计算机医生300字,未来医生的好帮手作文300字

热门文章

  1. 什么是JavaAgent?
  2. springMVC传参
  3. 自定义android进度条渐变,自定义ProgressBar简单完成颜色渐变功能进度条
  4. java(springboot) mybatis 数据权限详细实现(图文)
  5. 白领 放下你的“包袱”
  6. jpg怎么转换成pdf?分享3个方法
  7. android模拟器中如何浏览sdcard文件
  8. WEB前端 新手开始学习 6.21
  9. 关于争论中的*专业*,老赵谈一下自己的看法
  10. 树莓派4 ubuntu20.04安装PyInstaller