python中的数据存储认识
声明:本人是一个初学者,博客内容基本也是一些基础的东西,如果说的有什么问题欢迎纠正。
前言
许多人初学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中的数据存储认识的更多相关文章
- 67.Android中的数据存储总结
转载:http://mp.weixin.qq.com/s?__biz=MzIzMjE1Njg4Mw==&mid=2650117688&idx=1&sn=d6c73f9f04d0 ...
- Java基础知识强化之IO流笔记45:IO流练习之 把集合中的数据存储到文本文件案例
1. 把集合中的数据存储到文本文件案例: 需求:把ArrayList集合中的字符串数据存储到文本文件 ? (1)分析:通过题目的意思我们可以知道如下的一些内容,ArrayList集合里存储的是字 ...
- Android中的数据存储
Android中的数据存储主要分为三种基本方法: 1.利用shared preferences存储一些轻量级的键值对数据. 2.传统文件系统. 3.利用SQLite的数据库管理系统. 对SharedP ...
- Android中的数据存储(二):文件存储 2017-05-25 08:16 35人阅读 评论(0) 收藏
文件存储 这是本人(菜鸟)学习android数据存储时接触的有关文件存储的知识以及本人自己写的简单地demo,为初学者学习和使用文件存储提供一些帮助.. 如果有需要查看SharedPreference ...
- 【solr】SolrCloud中索引数据存储于HDFS
SolrCloud中索引数据存储于HDFS 本人最近使用SolrCloud存储索引日志条件,便于快速索引,因为我的索引条件较多,每天日志记录较大,索引想到将日志存入到HDFS中,下面就说说怎么讲sol ...
- Python 抓取数据存储到Redis中
redis是一个key-value存储结构.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set ...
- Python的小数据存储,用什么格式更有逼格?
小数据存储 我们在编写代码的时候,经常会涉及到数据存储的情况,如果是爬虫得到的大数据,我们会选择使用数据库,或者excel存储.但如果只是一些小数据,或者说关联性较强且存在存储后复用的数据,我们该如何 ...
- 【Cocos2d-x游戏开发】Cocos2d-x中的数据存储技术
一.引言 数据存储和网络功能可以说是一款游戏中必不可少的功能,如果一款游戏不能保存进度那么它的可玩性必然大打折扣(试想一下,玩家辛辛苦苦玩了一整天的游戏,结果退出时告诉人家不能保存关卡信息,你明天还得 ...
- 安卓中的数据存储方式以及ContentProvider的简单介绍
1.介绍android的数据存储方式 File存储 sharedPrefrence存储方式 conmtentprovider sqlitedatabase 网络存储 2.请介绍下ContentPr ...
随机推荐
- tomcat 在linux下启动时找不到JDK
方案一. 修改bashrc (转载: https://www.cnblogs.com/hongzg1982/articles/2101792.html) $ vim ~/.bashrc #加入JA ...
- 多线程高并发编程(7) -- Future源码分析
一.概念 A Future计算的结果. 提供方法来检查计算是否完成,等待其完成,并检索计算结果. 结果只能在计算完成后使用方法get进行检索,如有必要,阻塞,直到准备就绪. 取消由cancel方法执行 ...
- Python高级编程-Python一切皆对象
Python高级编程-Python一切皆对象 Python3高级核心技术97讲 笔记 1. Python一切皆对象 1.1 函数和类也是对象,属于Python的一等公民 ""&qu ...
- 牛客小白月赛16 小石的妹子 二分 or 线段树
牛客小白月赛16 这个题目我AC之后看了一下别人的题解,基本上都是线段树,不过二分也可以. 这个题目很自然就肯定要对其中一个进行排序,排完序之后再处理另外一边,另一边记得离散化. 怎么处理呢,你仔细想 ...
- dp cf 20190615
A. Timofey and a tree 这个不算是dp,就是一个思维题,好难想的思维题,看了题解才写出来的, 把点和边分开,如果一条边的两个点颜色不同就是特殊边,特殊边两边连的点就叫特殊点, 如果 ...
- jQuery中bind()与on()绑定事件的区别
.on()方法比.bind()方法多一个参数selector .on()的selector参数是筛选出调用.on()方法的dom元素的指定子元素,如: $("ul").on('cl ...
- spring学习笔记(二)spring中的事件及多线程
我们知道,在实际开发中为了解耦,或者提高用户体验,都会采用到异步的方式.这里举个简单的例子,在用户注册的sh时候,一般我们都会要求手机验证码验证,邮箱验证,而这都依赖于第三方.这种情况下,我们一般会通 ...
- 技术人的福音!教你如何使用Typora+PicGo实现图片自动上传功能
前言 写技术文章的小伙伴,对于 Typora 肯定不陌生,用来编写 Markdown 特别的方便. 但是,有个问题,就是当我们插入一个图片,并且使之可以在公网访问时,操作流程特别的麻烦. 首先,你需要 ...
- 数据结构——ArrayList的源码分析(你所有的疑问,都会被解答)
一.首先来看一下ArrayList的类图: 1,实现了RandomAccess接口,可以达到随机访问的效果. 2,实现了Serializable接口,可以用来序列化或者反序列化. 3,实现了List接 ...
- Mysql常用sql语句(19)- in / exists 子查询
测试必备的Mysql常用sql语句系列 https://www.cnblogs.com/poloyy/category/1683347.html 前言 子查询在我们查询方法中是比较常用的,通过子查询可 ...