深刻理解python之一——python3对象的一些特性

文章使用markdown写的,编辑的时候行间距还能够,显示的时候行间距好小,我也没办法。java

首先,须要明白的是python是一种解释性语言标准,他能够由c、java或者其余语言来实现。在python的标准中,变量是连接式的。举个例子来讲,内存中的对象和变量就像是给内存对象贴变量名标签而不是给变量盒子装入东西(数值信息)。或者说是给对象分配变量名,而不是给变量赋值。由于python对象在执行赋值以前就已经创立存在了的。python

对象标识和变量名

id()返回对象的标识,cpython中id()返回的是惟一的内存地址,变量名则是一个便于理解的别名。markdown

is和==的区别

is须要值和内存地址都相等,==只须要值相等。对于此更直观的表示能够执行一下id(),就能够看到不一样。
is比==更快,不能重载,直接比较的是id。code

变量的可变性

在基础阶段,不少教程都会提到,元祖是不可变的数据类型,因此没有插入和删除的操做,只能一次定义。但深究这个问题起来,其实元祖只是在引用上不能变化,但引用的对象是可变的,就致使元祖的值会跟着列表发生变化。浅复制时,多个变量引用同一列表地址,那么改变一个其余也会变。深复制是在内存中从新开辟一个区域,将原来的对象包括其中为对象引用的内容,一同复制到新的区域,并创建新的引用。引用变量的可变性看的是最小对象单位的类型,好比不可变元组中有可变列表对象,列表就是最小的单位,要看它的可变性。列表是可变的,这种特性使得在指向同一个列表对象的状况下,列表实际的长度和值是能够改变的。对其余的类型对象通常不可变,也就不会发生上述变化。对象

最大的威胁在于,将列表做为参数传给类方法的时候,类变量和参数绑定了同一个对象,执行完返回后原来的传入参数的对象发生了变化。除了刻意要去改传入的列表,不然应该在这以前深复制一个副本,不影响原来的变量的使用。教程

建立列表的几种写法

a = [1,2,3]
b=a
b is a
>>True

c = list(a)
c is a
>>False

d = a[:]
d is a
>>False

相似上面使用b=a这样的办法建立的列表,其实只是新建了一个引用,并无新建一个对象。若是改变a、b其中一个,另外一个会随着改变。内存

深复制和浅复制的具体区别

copy模块能够完成浅复制和深复制,分别对应方法copy()和deepcopy()。其中,deepcopy()能够完成对包含循环引用的对象的拷贝。基础

具体能够用下面的a分别作两种拷贝,会发现其中深拷贝获得的a[1]的内容和另外二者是不一同样的。变量

a = (1,[2,3],(4,5))

使用两种拷贝分别复制后查看结果。循环

相关文章
相关标签/搜索