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

前言

许多人初学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. 工厂模式(factory pattern)

    工厂模式主要用来封装对象的创建,有3种分类:简单工厂(simple factory).工厂方法(factory method).抽象工厂(abstract factory). 简单工厂包括3种组成元素 ...

  2. Python词云生成

    一.目的 1. 熟悉jieba库和wordcloud库的使用方法: 2. 熟悉文本词频统计和词云生成的基本方法. 二.内容 1. 从网上自行下载一个长篇英文小说,统计并输出该小说中词频最大的TOP 2 ...

  3. spring对websocket的集成和使用

    WebSocket是HTML5提出的一个用于通信的协议规范,该协议通过一个握手机制,在客户端和服务端之间建立一个类似于TCP的连接,从而方便客户端和服务端之间的通信. WebSocket协议本质上是一 ...

  4. c#得出两个列表的交集

    c#提供了Intersect来得到两个列表的交集,它是通过使用默认的相等比较器对值进行比较生成两个序列的交集,定义为: public static IEnumerable<TSource> ...

  5. 使用 PyCharm 添加 Django 项目

    一.前置准备(PyCharm与Python的下载,已有的跳过) 1.首先下载PyCharm 地址:http://www.jetbrains.com/pycharm/ 2.然后下载Python 地址:h ...

  6. HDU 2013 (水)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2013 题目大意:已知最后一天桃子只有一个,告诉你猴崽子第一天吃掉总桃子数的一半多一个,第二天吃掉剩下总 ...

  7. Mysql 常用函数(19)- mod 函数

    Mysql常用函数的汇总,可看下面系列文章 https://www.cnblogs.com/poloyy/category/1765164.html mod 的作用 求余数,和%一样 mod的语法格式 ...

  8. tp5.1 nginx环境下url去掉index.php

    原来的地址http://xxxxxxx/index.php/admin/login/index.html 修改完的路径http://xxxxxxx/admin/login/index.html 修改. ...

  9. Java并发编程实战 05等待-通知机制和活跃性问题

    Java并发编程系列 Java并发编程实战 01并发编程的Bug源头 Java并发编程实战 02Java如何解决可见性和有序性问题 Java并发编程实战 03互斥锁 解决原子性问题 Java并发编程实 ...

  10. 【图机器学习】cs224w Lecture 10 - PageRank

    目录 PageRank Problems Personalized PageRank 转自本人:https://blog.csdn.net/New2World/article/details/1062 ...