声明:本人是一个初学者,博客内容基本也是一些基础的东西,如果说的有什么问题欢迎纠正。

前言

许多人初学python之前应该也学习过其他的语言,比如博大精深的c语言,笔者在学习python之前就学习过c语言,众所周知的是c语言是一个面向过程的语言,而python是属于面向对象的语言,表明二者在编程时会有所不同。既然要说python的数据存储认识,为什么要提到c语言呢?下面介绍笔者在初学python时类比c语言出现的一些误区。

笔者学习c语言时经常性的想起一句话:指针即地址。在c语言的编程中传递参数的副本还是原本是在参数传递时控制,如果想给函数传递原本就在变量之前加一个取地址符号(&),传递副本则直接写变量的名字即可。传递原本和传递副本的区别在于:传递副本时在函数中所做的修改不会在函数之外改变,传递原本则在函数中所做的修改也会对函数之外起作用。在刚开始学习python时经常会和c语言类比,将可变数据类型的引用类比成c语言中的传递原本,将不可变数据类型的引用类比成c语言中的传递副本。表面上理解是没有任何问题,但是这个想法在本质上还是错误的,下面会举例解释。

python引用正确的理解方式

python中是不允许程序员直接选择是值传递还是地址传递(传递副本还是传递原本)。python中可以说只有一种传递参数的方式,那就是引用传递。只不过基于对象的不同,大致又可以分为不可变类型的引用传递和可变类型的引用传递。可变类型的引用可以有多个,但是储存信息的地址只有一个,所以当通过多个应用中的某个引用对存储内容进行修改时,其实都是对一个地址修改,所以会呈现出所有引用都变化的效果。不可变类型的引用只有一个,当你尝试在函数中改变这个变量的值时(即例如 变量名 = 新的值),python会新建一个变量引用用来指向这个新的值(使用id函数比较两个地址会返回False),两个对象虽然名字一样,但是它们两个是没有任何关系的,所以呈现出的效果就是原来的不可变对象不变。

可变类型(mutable):列表,字典

不可变类型(unmutable):数字,字符串,元组

这里的可变不可变,是指内存中的那块内容(value)是否可以被改变

进一步举例说明

python中的del函数的作用是删除一个对象的某个引用,而python的回收机制是当指向某对象引用为0时就将该对象回收。所以del在操作只有一个引用的对象时类似于直接删除对象的效果。

下面的代码为举例使用del函数删除a_list列表中的是三倍数的元素时出现的删除不了的状况。

def change(a_list_change):
for data in a_list_change:
if data % 3 == 0:
del data a_list = [1, 3, 5, 7, 9, 11, 13, 15]
change(a_list)
print(a_list)

输出的结果为[1, 3, 5, 7, 9, 11, 13, 15]。原因在于del只删除了for循环迭代中产生的指向a_list_change元素的data引用,所以a_list的元素并不会被删除。

将其中的语句del data 改为a_list_change.remove(data)后的代码如下。

def change(a_list_change):
for data in a_list_change:
if data % 3 == 0:
a_list_change.remove(data) a_list = [1, 3, 5, 7, 9, 11, 13, 15]
change(a_list)
print(a_list)

此时输出的结果为[1, 5, 7, 11, 13],可见已经把是三倍数的数字删除了。

此时如果是c语言的思维方式就无法解释这种删除引用的现象了。

顺便一提python是一种足够智能的编程语言,当不可变类型int足够小,而且有多个引用指向它的时候,比较他们的id地址,会出现相同的情况,因为python为了节省内存,会出现这样的情况,但是不会影响用户的使用。

python中的数据存储认识的更多相关文章

  1. 67.Android中的数据存储总结

    转载:http://mp.weixin.qq.com/s?__biz=MzIzMjE1Njg4Mw==&mid=2650117688&idx=1&sn=d6c73f9f04d0 ...

  2. Java基础知识强化之IO流笔记45:IO流练习之 把集合中的数据存储到文本文件案例

    1. 把集合中的数据存储到文本文件案例:    需求:把ArrayList集合中的字符串数据存储到文本文件 ? (1)分析:通过题目的意思我们可以知道如下的一些内容,ArrayList集合里存储的是字 ...

  3. Android中的数据存储

    Android中的数据存储主要分为三种基本方法: 1.利用shared preferences存储一些轻量级的键值对数据. 2.传统文件系统. 3.利用SQLite的数据库管理系统. 对SharedP ...

  4. Android中的数据存储(二):文件存储 2017-05-25 08:16 35人阅读 评论(0) 收藏

    文件存储 这是本人(菜鸟)学习android数据存储时接触的有关文件存储的知识以及本人自己写的简单地demo,为初学者学习和使用文件存储提供一些帮助.. 如果有需要查看SharedPreference ...

  5. 【solr】SolrCloud中索引数据存储于HDFS

    SolrCloud中索引数据存储于HDFS 本人最近使用SolrCloud存储索引日志条件,便于快速索引,因为我的索引条件较多,每天日志记录较大,索引想到将日志存入到HDFS中,下面就说说怎么讲sol ...

  6. Python 抓取数据存储到Redis中

    redis是一个key-value存储结构.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set ...

  7. Python的小数据存储,用什么格式更有逼格?

    小数据存储 我们在编写代码的时候,经常会涉及到数据存储的情况,如果是爬虫得到的大数据,我们会选择使用数据库,或者excel存储.但如果只是一些小数据,或者说关联性较强且存在存储后复用的数据,我们该如何 ...

  8. 【Cocos2d-x游戏开发】Cocos2d-x中的数据存储技术

    一.引言 数据存储和网络功能可以说是一款游戏中必不可少的功能,如果一款游戏不能保存进度那么它的可玩性必然大打折扣(试想一下,玩家辛辛苦苦玩了一整天的游戏,结果退出时告诉人家不能保存关卡信息,你明天还得 ...

  9. 安卓中的数据存储方式以及ContentProvider的简单介绍

    1.介绍android的数据存储方式 File存储 sharedPrefrence存储方式 conmtentprovider sqlitedatabase 网络存储   2.请介绍下ContentPr ...

随机推荐

  1. 安卓commandlinetools-win-6200805_latest配置

    JDK:1.8.0_251 系统:win10 64bit 问题1 官网下载commandlinetools,解压运行报错 解决方法 打开sdkmanager.bat,修改第17行为set DEFAUL ...

  2. zabbix监控nginx日志状态码

    监控需求 监控Nginx常见的状态码并对其进行监控,对常见的错误状态码创建相对应的触发器以下按照分钟对数据进行抓取 Zabbix_Agentd创建监控脚本 1)创建脚本之前核对Nginx日志格式我这里 ...

  3. Java——抽象类与接口的前世今生

    该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 1.抽象类: 当编写 ...

  4. E - Tunnel Warfare HDU - 1540 F - Hotel G - 约会安排 HDU - 4553 区间合并

    E - Tunnel Warfare HDU - 1540 对这个题目的思考:首先我们已经意识到这个是一个线段树,要利用线段树来解决问题,但是怎么解决呢,这个摧毁和重建的操作都很简单,但是这个查询怎么 ...

  5. Django 设置admin后台表和App(应用)为中文名

    设置表名为中文 1.设置Models.py文件 class Post(models.Model): name = models.CharField() --省略其他字段信息 class Meta: v ...

  6. python语法学习第十天--类与对象

    python面向对象语言 对象=属性+方法 OO(Object oriented面向对象)的特征: ①封装,信息隐蔽技术②继承:class A(BaseClass):③多态   类:图纸 class ...

  7. 1013 Battle Over Cities (25分) 图的连通分量+DFS

    题目 It is vitally important to have all the cities connected by highways in a war. If a city is occup ...

  8. 推荐 10个 NB的 IDEA 插件,开发效率至少提升一倍

    友情提示:插件虽好,可不要贪装哦,装多了会 卡 .卡 .卡 ~ 正经干活用的 分享一点自己工作中得心应手的IDEA插件,可不是在插件商店随随便便搜的,都经过实战检验,用过的都说好.可能有一些大家用过的 ...

  9. JQ选择器-选择符合条件的元素,获取对应关系元素

    如果你想寻找id以“sub_”开头的元素,你可以使用: $("*[id^='sub_']") 如果你想寻找id以“trim”结尾的元素,你可以使用: $("*[id$=' ...

  10. 以前的一些word的整理

    LAMP部署 环境:虚拟机centos7 安装apache: 命令:yum install -y httpd (在执行这个命令时,可能会遇到运行yum时出现/var/run/yun.pid已被锁定,P ...