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. LeetCode题解之Diameter of Binary Tree

    1.题目描述 2.分析 深度优先. 3.代码 int ans; int diameterOfBinaryTree(TreeNode* root) { ans = ; depth(root); ; } ...

  2. [20171211][转载]如何实现dbms_output输出没有打开serveroutput on.txt

    [20171211]如何实现dbms_output输出没有打开serveroutput on.txt http://orasql.org/2017/12/10/sqlplus-tips-8-dbms_ ...

  3. django静态文件

    django静态文件(js脚本.CSS.图片等) 默认统一放在每一个app的static文件夹下, 通过收集静态文件命令,自动将每一个app下static文件夹下的文件复制到根目录的static文件夹 ...

  4. Go语言学习笔记(一)Let's 干吧

    加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 简介     Go是Google开发的一种 静态强类型.编译型,并发型,并具有垃圾回收功能的编程语言.为了方便搜索 ...

  5. kvm企业级虚拟化环境部署

    由于要做毕设了,不得不要搭建Linux环境,自己做的课题是ELK日志分析相关.因此要大干一场,一下子计划采用近10台机器来做试验,但由于我这里只有三台物理机,所以我就搞起了虚拟化kvm.在Linux里 ...

  6. 12个HTML和CSS必须知道的重点难点问题

    这12个问题,基本上就是HTML和CSS基础中的重点个难点了,也是必须要弄清楚的基本问题,其中定位的绝对定位和相对定位到底相对什么定位?这个还是容易被忽视的,浮动也是一个大坑,有很多细节.这12个知识 ...

  7. 利用java webservice调用天气预报实践

    最近要和其他业务系统进行数据交换,选择了webservice方案,于是查了一下网上的用法.首先是做一个天气的查询例子,看着挺简单,可实际动手做起来发现坑很多,费了半天劲终于调通了,于是记录下来. 1, ...

  8. 使用POI读写Word doc文件

    使用POI读写word doc文件 目录 1     读word doc文件 1.1     通过WordExtractor读文件 1.2     通过HWPFDocument读文件 2     写w ...

  9. Redis本身是单线程线程安全的内存数据库,但是不代表你的使用就是线程安全的

    网上一个错误示例:https://www.cnblogs.com/Simeonwu/p/7881100.html,部分代码如下: package com.me.config; import redis ...

  10. JS面向对象之工厂模式

    js面向对象 什么是对象 "无序属性的集合,其属性可以包括基本值.对象或者函数",对象是一组没有特定顺序的的值.对象的没个属性或方法都有一个俄名字,每个名字都映射到一个值. 简单来 ...