设为首页 收藏本站
查看: 1365|回复: 0

[经验分享] Python对象(下)

[复制链接]

尚未签到

发表于 2015-11-29 11:03:07 | 显示全部楼层 |阅读模式
  前面一篇文章介绍了一些Python对象的基本概念,这篇接着来看看Python对象相关的一些内容。

Python对象的比较
  Python对象有三个要素:身份,类型和值,所以我们就分别从这三个角度出发看看对象之间的比较。

对象身份比较
  对象身份的比较,其实就是比较对象的内存地址,即内建函数id()的结果比较。可以用来判断不同的变量是否指向了同一个地址。
  直接看例子:
DSC0000.png
  通过例子的输出可以得到,f1和f2指向了不同的对象(地址);但是,i1和i2却指向了相同的对象(地址)。
  之所以产生这种差异,是因为Python对整数对象和字符串对象会进行缓存,所以没有产生新的对象,而是指向了缓存的对象。不同版本的Python处理缓存是不一样的,所以同样的例子可能产生不同的结果。
  对于对象身份比较,还可以使用Python中的"is"关键字:



obj1 is obj2
# 等价
id(obj1) == id(obj2)
obj1 is not obj2
# 等价
id(obj1) != id(obj2)
对象类型比较
  通过type()内建函数,可以得到一个对象的类型,然后就可以进行类型比较了。
  看一段代码:
DSC0001.png
  例子中使用了三种方式进行对象类型的比较:


  • 直接将type(obj)与类型进行比较
  • 将type(obj)的身份跟类型的身份进行比较


  • 通过内建的isinstance()函数,判断一个对象是不是有特定类型实例化得到的

    • 其第一个参数为对象,第二个为类型名或类型名的一个列表
    • 其返回值为布尔型


  简单看看前两种方式的区别,第一种方式是直接将两个类型对象的值进行比较;而第二种方式比较的是两个类型对象的身份,这种方式的原理是,如果两个类型对象的身份不同,那么两个类型对象的值肯定不同。

对象值比较
  对于Python对象,可以直接使用比较操作符(>,<,==等)进行对象值的比较。关于Python的内建对象,有一套比较规则,比如两个list对象的比较就是按照list比较规则进行的。
  这里我们就主要看看自定义类型的对象之间的比较。
  自定义类型的对象值比较
  在Python中,所有的类型都有一套用于比较的"魔术方法" ,对于自定义的类型,我们就可以通过实现这些方法来定义自定义类型的对象的比较行为:


  • __cmp__(self, other) : __cmp__ is the most basic of the comparison magic methods. __cmp__ should return a negative integer if self < other, zero if self == other, and positive if self > other.
  • __eq__(self, other) Defines behavior for the equality operator, ==.
  • __ne__(self, other) Defines behavior for the inequality operator, !=.
  • __lt__(self, other) Defines behavior for the less-than operator, <.
  • __gt__(self, other) Defines behavior for the greater-than operator, >.
  • __le__(self, other) Defines behavior for the less-than-or-equal-to operator, <=.
  • __ge__(self, other) Defines behavior for the greater-than-or-equal-to operator, >=.
  看一个例子,我们定义了一个"语句"类型,并实现了一些比较方法,这样对于改类型的对象,我们就可以直接通过比较操作符进行对象值比较了。
DSC0002.png
  有一点需要注意的是,关于自定义类型的对象,如果没有实现比较操作符对应的"魔术方法",那么将默认使用对象身份(id())进行比较。
  "is"和"=="的差别
  这里需要注意一下"is"和"=="之间的差别:


  • "is"用来比较对象的身份是否相等,也就是说,比较对象的内存地址是否相同(变量是否指向同一个对象)
  • "=="用来比较对象的内容(值)是否相等
  看下面的代码:
DSC0003.png
  对于变量c和d,由于数值超过了Python对整型数的缓存范围,所有d就会是Python生成的一个新的对象。因此,c和d的值是相同的,但是身份却是不同的。

可变对象和不可变对象
  在Python中,一切都是对象,Python中不存在所谓的传值,一切传递的都是对象的引用(也可以认为是传址)。
  上一篇文章中了解到,根据Python对象的类型,可以将Python对象分为:Type Object(类型对象)和Non-type Object(非类型对象)。
  同样,根据对象的可变性,也可以将Python对象分为两类:可变(mutable)对象和不可变(immutable)对象。




  • 不可变(immutable)对象:对象的内容不可变,当尝试改变对象内容的时候,会创建一个新的对象;也就是说对象的身份(id())会发生变化

    • 例如:number、string,tuple




  • 可变(mutable)对象:对象的内容可变,当改变对象内容的时候,对象的身份(id())不会变化

    • 例如:list、dict、set


  看一段简单的代码:
DSC0004.png

tuple是"可变的"
  虽然元组对象本身是不可变的,但这并不意味着元组包含的可变对象也不可变。
  看下面的例子:
DSC0005.png
  现在我们根据下图分析这段代码,tpl这个元组的第四个元素比较特殊,是一个list;所以,在tpl中第四个元素存放的是这个list的地址(身份id(),引用)。
  元组的不可变性就决定了tpl第四个元素对应的内容,即list的地址不能改变了,但是,这个地址37865712指向的内容是可以被改变的。
DSC0006.png

总结
  本篇介绍了Python对象的比较,包括对象的身份,类型以及值的比较。对于自定义类型的对象,如果需要进行比较操作,可以通过自定义比较操作相关的"魔术方法"。
  另外,文中简单介绍了Python对象的可变性,对比了可变(mutable)对象和不可变(immutable)对象之间的不同。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-144857-1-1.html 上篇帖子: 用pygame学习初级python(二) 15.5.11 下篇帖子: 2015/11/7用Python写游戏,pygame入门(7):碰撞检测
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表