深刻理解Python对象四要素

花卉        2019-09-11   来源:豆豆君大世界

在Python中,一切皆对象(此处略过上万字,后面专门论述)。

对象,可以看成是内存中的一个真实存在的数据,是有内存指针的。

对象四要素

大多数书上都说,Python有三要素。但我个人认为,任何一个Python对象,通常有四要素:id, type,value和alias。Id是对象的唯一标志,type表示这个对象的数据类型,value表示这个对象的具体的值,alias是这个对象的别名/引用名称(可选)。最后的alias是我加上去的,请先别喷,先听我说。

深刻理解Python对象四要素

Python对象四要素

  • 1)对象id

a) 对象id在创建后从来不会改变,相当于内存中的地址,每个对象都有唯一的id。

b) Id()函数可以返回对象id(内存指针),因此可以用来判断两个变量指向的对象是不是一样的。

  • 2)对象type

a) 相当于变量或对象保存的数据类型。

b) 可用内置函数type()来查看对象的数据类型。

  • 3)对象value

a) 对象value就是对象真实的值。

b) 一般情况下,可用内置函数print()直接输出对象的值。

  • 4)对象alias(可选要素)

a) 对象alias(别名)就是变量名。变量名其实就是对象的引用名称。

b) 有时候对象是可以没有别名的(比如用完就丢弃,不需要再次引用)。

c) 所谓的实例化,即在内存中创建了一个真实的对象;而所谓变量赋值,其实就是变量指向了内存中一个真实的数据对象。此时,使用变量和直接使用对象是完全一样的,所以多数时候,我们都是用变量来代替数据引用,以做到简洁易读。

参考如下代码。

深刻理解Python对象四要素

对象类型识别

由于Python变量是没有类型的,可以指向任何数据类型的对象,要想知道当前变量保存的是什么样的数据类型,或者两个变量指向的是否是同一个对象,经常会涉及到如下三个内置函数:

1) is身份运算符,用来判断两个对象是否指向的是同一个对象。其实is操作符就是比较的是两个对象的ID是否一样,如果一样表示这两个对象是同一个。

2) type()函数,用来打印出对象的数据类型。

3) isinstance()函数,来判断变量保存的对象是不是指定的数据类型。

注:ininstace和type的区别在于:type()不会认为子类是一种父类;而isinstance会认为子类也是一种父类类型。

深刻理解Python对象四要素

对象类型识别

变量与对象的指向

下面以一段代码来描述变量与对象的指向关系。

深刻理解Python对象四要素

不可变类型修改,会发生指针指向变化

代码说明:

第1行代码id(3),此时Python在内存中创建一个对象3(但没有名字);

第2行代码id(4),此时Python在内存中创建一个对象4(但没有名字);

--可知这两个对象的id是不一样的(id号相差32,知道为何?)

第3行代码n1=3,给对象3一个名字(变量名n1);

第4-5行,可知n1和3其实指的是同一个对象;

第6-7行,相当于给对象4取了两个别名n2,n3;

第8-9行,可知n2、n3、4这三个描述的是同一个对象;

第10行,n3=5是赋值语句,你认为会发生什么?会不会将内存中的对象4修改为5了?不会,因为整数是不可变数据类型,是不能修改的。所以,Python会重新在内存中创建一个对象5,将将n3指向对象5;

第11-12行,表明n2和n3已经是不一样的对象了。

变量类型不一样,修改时指向会有不同的指向

变量修改(变量赋值)的结果,是会受到变量的数据类型的影响的。

1)右边例子中使用的是int(不可变数据类型),原来n2和n指向同一个对象2,当修改n2时,n不会发生变化,说明此时n2指向和n指向不同了。

2)左边例子中使用的是list(可变数据类型),原来lt2和lt指向同一个列表对象,现在修改lt2,但是lt也发生了改变,说明此时lt2指向和lt指向还是相同的。

所以总结一下:

不可变类型变量修改,会发生变量指向改变;

可变类型变量修改,不会发生变量指向改变。

深刻理解Python对象四要素

欢迎联系我参加学习!