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

前言

许多人初学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. 最长公共子串(Longest common substring)

    问题描述: 给定两个序列 X=<x1, x2, ..., xm>, Y<y1, y2, ..., yn>,求X和Y长度最长的公共子串.(子串中的字符要求连续) 这道题和最长公共 ...

  3. 简单搜索 kuangbin C D

    C - Catch That Cow POJ - 3278 我心态崩了,现在来回顾很早之前写的简单搜索,好难啊,我怎么写不出来. 我开始把这个写成了dfs,还写搓了... 慢慢来吧. 这个题目很明显是 ...

  4. CSS中的间距设置与盒子模型

    CSS间距 内补白 外补白 盒子模型 CSS间距 很多时候我们为了美观,需要对内容进行留白设置,这时候就需要设置间距了. 内补白 设置元素的内间距 padding: 检索或设置对象四边的内部边距 pa ...

  5. 使用 vi 命令创建一个cpp文件

    mkdir text //创建一个text的文件夹 cd text //打开text的文件夹 vi text.cpp //创建text.cpp 按住 i 键输入程序 输入后按esc,再按wq退出 ls ...

  6. JavaWeb实战:报价计算系统(layui+tomcat+cookie实现)

    JavaWeb实战:报价计算系统(layui+tomcat+cookie实现) 系统概述: 该系统是文物物流公司的一个小功能模块,用于帮助用户计算运费.点击查看实际效果 系统文档: 添加展品: 在表单 ...

  7. spring-boot如何去获取前端传递的参数

    本文主要讨论spring-boot如何获取前端传过来的参数,这些参数主要有两大类,一类是URL里的参数,一个是请求body里的参数 url里的参数 通过url里传过来的参数一般有三种方式,下面我们来看 ...

  8. 使用IR2104S搭建的H桥-机器人队比赛经典版(原作者答疑)

    原理图地址:http://bbs.ednchina.com/BLOG_ARTICLE_3020313.HTM?click_from=8800020962,4950449047,2014-05-01,E ...

  9. python语法学习第六天--字典

    字典:可变容器类型,用键值对的形式采用花括号储存(键唯一) 语法:d={key1:value1,key2:value2} 访问字典中的值: 字典名[键名]#若字典中不存在则报错 更改字典: 添加值:字 ...

  10. jquery遍历数组、对象

    1,for循环: var arr = new Array(13.5,3,4,5,6); for(var i=0;i<arr.length;i++){ arr[i] = arr[i]/2.0; } ...