声明:本人是一个初学者,博客内容基本也是一些基础的东西,若是说的有什么问题欢迎纠正。python
许多人初学python以前应该也学习过其余的语言,好比博大精深的c语言,笔者在学习python以前就学习过c语言,众所周知的是c语言是一个面向过程的语言,而python是属于面向对象的语言,代表两者在编程时会有所不一样。既然要说python的数据存储认识,为何要提到c语言呢?下面介绍笔者在初学python时类比c语言出现的一些误区。程序员
笔者学习c语言时常常性的想起一句话:指针即地址。在c语言的编程中传递参数的副本仍是本来是在参数传递时控制,若是想给函数传递本来就在变量以前加一个取地址符号(&),传递副本则直接写变量的名字便可。传递本来和传递副本的区别在于:传递副本时在函数中所作的修改不会在函数以外改变,传递本来则在函数中所作的修改也会对函数以外起做用。在刚开始学习python时常常会和c语言类比,将可变数据类型的引用类比成c语言中的传递本来,将不可变数据类型的引用类比成c语言中的传递副本。表面上理解是没有任何问题,可是这个想法在本质上仍是错误的,下面会举例解释。编程
python中是不容许程序员直接选择是值传递仍是地址传递(传递副本仍是传递本来)。python中能够说只有一种传递参数的方式,那就是引用传递。只不过基于对象的不一样,大体又能够分为不可变类型的引用传递和可变类型的引用传递。可变类型的引用能够有多个,可是储存信息的地址只有一个,因此当经过多个应用中的某个引用对存储内容进行修改时,其实都是对一个地址修改,因此会呈现出全部引用都变化的效果。不可变类型的引用只有一个,当你尝试在函数中改变这个变量的值时(即例如 变量名 = 新的值),python会新建一个变量引用用来指向这个新的值(使用id函数比较两个地址会返回False),两个对象虽然名字同样,可是它们两个是没有任何关系的,因此呈现出的效果就是原来的不可变对象不变。编程语言
可变类型(mutable):列表,字典函数
不可变类型(unmutable):数字,字符串,元组学习
这里的可变不可变,是指内存中的那块内容(value)是否能够被改变spa
python中的del函数的做用是删除一个对象的某个引用,而python的回收机制是当指向某对象引用为0时就将该对象回收。因此del在操做只有一个引用的对象时相似于直接删除对象的效果。指针
下面的代码为举例使用del函数删除a_list列表中的是三倍数的元素时出现的删除不了的情况。code
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为了节省内存,会出现这样的状况,可是不会影响用户的使用。