在Python中,一切皆对象(此处略过上万字,后面专门论述)。 对象,可以看成是内存中的一个真实存在的数据,是有内存指针的。 对象四要素大多数书上都说,Python有三要素。但我个人认为,任何一个Python对象,通常有四要素:id, type,value和alias。Id是对象的唯一标志,type表示这个对象的数据类型,value表示这个对象的具体的值,alias是这个对象的别名/引用名称(可选)。最后的alias是我加上去的,请先别喷,先听我说。 Python对象四要素
a) 对象id在创建后从来不会改变,相当于内存中的地址,每个对象都有唯一的id。 b) Id()函数可以返回对象id(内存指针),因此可以用来判断两个变量指向的对象是不是一样的。
a) 相当于变量或对象保存的数据类型。 b) 可用内置函数type()来查看对象的数据类型。
a) 对象value就是对象真实的值。 b) 一般情况下,可用内置函数print()直接输出对象的值。
a) 对象alias(别名)就是变量名。变量名其实就是对象的引用名称。 b) 有时候对象是可以没有别名的(比如用完就丢弃,不需要再次引用)。 c) 所谓的实例化,即在内存中创建了一个真实的对象;而所谓变量赋值,其实就是变量指向了内存中一个真实的数据对象。此时,使用变量和直接使用对象是完全一样的,所以多数时候,我们都是用变量来代替数据引用,以做到简洁易读。 参考如下代码。 对象类型识别由于Python变量是没有类型的,可以指向任何数据类型的对象,要想知道当前变量保存的是什么样的数据类型,或者两个变量指向的是否是同一个对象,经常会涉及到如下三个内置函数: 1) is身份运算符,用来判断两个对象是否指向的是同一个对象。其实is操作符就是比较的是两个对象的ID是否一样,如果一样表示这两个对象是同一个。 2) type()函数,用来打印出对象的数据类型。 3) isinstance()函数,来判断变量保存的对象是不是指定的数据类型。 注:ininstace和type的区别在于:type()不会认为子类是一种父类;而isinstance会认为子类也是一种父类类型。 对象类型识别 变量与对象的指向下面以一段代码来描述变量与对象的指向关系。 不可变类型修改,会发生指针指向变化 代码说明: 第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指向还是相同的。 所以总结一下: 不可变类型变量修改,会发生变量指向改变;可变类型变量修改,不会发生变量指向改变。欢迎联系我参加学习! |
|