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 学习 第四篇:动态类型模型的更多相关文章

  1. [python学习手册-笔记]004.动态类型

    004.动态类型 ❝ 本系列文章是我个人学习<python学习手册(第五版)>的学习笔记,其中大部分内容为该书的总结和个人理解,小部分内容为相关知识点的扩展. 非商业用途转载请注明作者和出 ...

  2. python学习笔记17(动态类型)

    动态类型 在我们接触的对象中,有一类特殊的对象,是用于存储数据的,常见的该类对象包括各种数字,字符串,表,词典.在C语言中,我们称这样一些数据结构为变量,而在Python中,这些是对象. 对象是储存在 ...

  3. Python学习第四篇——列表访问与判定

    avilable_foods=["soup","beaf","noddle","pepper"] request_foo ...

  4. Python学习笔记进阶篇——总览

    Python学习笔记——进阶篇[第八周]———进程.线程.协程篇(Socket编程进阶&多线程.多进程) Python学习笔记——进阶篇[第八周]———进程.线程.协程篇(异常处理) Pyth ...

  5. Python学习(四)数据结构(概要)

    Python 数据结构 本章介绍 Python 主要的 built-type(内建数据类型),包括如下: Numeric types          int float Text Sequence ...

  6. python学习-第四天补充-面向对象

    python学习-第四天补充-面向对象 python 私有 --name mangling(名字修改.名字) 在命名时,通过使用两个下划线作为开头,可以使得这个变量或者函数编程私有的,但是这个其实的p ...

  7. Python 学习 第十篇 CMDB用户权限管理

    Python 学习 第十篇 CMDB用户权限管理 2016-10-10 16:29:17 标签: python 版权声明:原创作品,谢绝转载!否则将追究法律责任. 不管是什么系统,用户权限都是至关重要 ...

  8. Python学习笔记基础篇——总览

    Python初识与简介[开篇] Python学习笔记——基础篇[第一周]——变量与赋值.用户交互.条件判断.循环控制.数据类型.文本操作 Python学习笔记——基础篇[第二周]——解释器.字符串.列 ...

  9. python学习第四讲,python基础语法之判断语句,循环语句

    目录 python学习第四讲,python基础语法之判断语句,选择语句,循环语句 一丶判断语句 if 1.if 语法 2. if else 语法 3. if 进阶 if elif else 二丶运算符 ...

随机推荐

  1. XSS(跨站脚本攻击)漏洞解决方案

    首先,简单介绍一下XSS定义: 一 . XSS介绍 XSS是跨站脚本攻击(Cross Site Scripting)的缩写.为了和层叠样式表CSS(Cascading Style Sheets)加以区 ...

  2. (后端)出现org.hibernate.NonUniqueResultException的原因即解决办法

    百度出来的资料解决问题: 一个问题,事务处理完毕以后页面没有刷新.刚开始以为是前台js的问题,后来检查js没有任何问题,跟踪到后台发现后台报错了,错误信息如下:org.hibernate.NonUni ...

  3. (后端)org.springframework.dao.EmptyResultDataAccessException: Incorrect result size: expected 1,actual 0

    两种方案: 用queryForList方法替换queryForObject或者queryForMap,因为这两个方法必须要有值,不能为空. 把这个异常捕获,用try/catch. 这个查询的结果是nu ...

  4. django学习之命令

    1.启动一个django项目: $ django-admin startproject <project-name> 2.创建一个应用: $ python manage.py starta ...

  5. 几种流行的AJAX框架jQuery,Mootools,Dojo,Ext JS的对比

    AJAX是web2.0的基石,现在网上流行几种开源的AJAX框架,比如:jQuery,Mootools,Dojo,Ext JS等等,那么我们到底在什么情况下该使用那个框架? 让我们来想想选择AJAX框 ...

  6. Sql Server 只有MDF文件恢复数据库的方法以及2008清除日志文件

    首先建立同名的空数据库,然后停止数据库服务运行,将MDF文件覆盖后启动服务,并修改和执行下面的语句. alter database JinMa_NYGL set EMERGENCY alter dat ...

  7. 变量计算——强制类型转换的js面试题

    console.log(1+"2"+"2"); console.log(1++"2"+"2"); console.log ...

  8. UG/NX 8.0安装方法(图文详解)

    UG8.0,自从被西门子收购后改名为NX,也称NX8.0,作为一款非常优秀三维模具设计软件.他可以针对用户的虚拟产品设计和工艺设计的需求,提供经过实践验证的解决方案.其以全面的设计概念.良好的界面受到 ...

  9. P1019 单词接龙

    单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一 ...

  10. js常见错误类型

    (1)SyntaxError SyntaxError是解析代码时发生的语法错误 // 变量名错误 var 1a; // 缺少括号 console.log 'hello'); (2)ReferenceE ...