疯狂的Python-04(鸠占鹊巢)

作者: 景行1023 | 来源:发表于2018-09-03 22:29 被阅读5次

一些有趣的鲜为人知的Python特性集合

无论你是Python新手还是Python老手,我相信,这个系列的文章都会让你获益良多!

阅读此系列任何文章前请务必观看:疯狂的Python-目录大纲


▶ 鸠占鹊巢 *

class Crazy:
  pass

Output:

>>> Crazy() == Crazy() # 两个类实例是不同的
False
>>> Crazy() is Crazy() # 它们的id号也是不一样的
False
>>> hash(Crazy()) == hash(Crazy()) # 它们的哈希值按说也应该不一样
True
>>> id(Crazy()) == id(Crazy())
True

💡 解释:

  • id函数被调用的时候,Python创建了一个Crazy类实例,然后把这个实例传给了id函数。然后id函数返回这个实例的"id"号(实际上就是这个实例在内存中的地址),接着这个实例就被丢弃并且销毁了。

  • 当我们紧接着再做一遍上面的步骤的时候,Python会把同一块内存空间分配给第二次创建的Crazy实例。又因为在CPython中id函数使用的是内存地址作为返回值,所以就会出现两个对象实例的id号相同的情况了。

  • 所以,"对象的id是唯一的"这句话有一个前提条件是"在这个对象的生命周期内"。当这个对象在内存被销毁以后,其他的对象就可以占用它之前所用的内存空间产生一样的id号。

  • 但是为什么上面的例子里is操作符却产生了False? 我们再看一个例子。

    class Crazy(object):
      def __init__(self): print("I")
      def __del__(self): print("D")
    

    Output:

    >>> Crazy() is Crazy()
    I
    I
    D
    D
    False
    >>> id(Crazy()) == id(Crazy())
    I
    D
    I
    D
    True
    

    现在你可以发现, 不同的使用实例的方法会对实例销毁的时间产生影响。

相关文章

  • 疯狂的Python-04(鸠占鹊巢)

    一些有趣的鲜为人知的Python特性集合 无论你是Python新手还是Python老手,我相信,这个系列的文章都会...

  • Python-04

    参考 : 庞雪峰Python教程 Github-Python资源大全 Python中文资源大全 一、Python ...

  • Python-04题

    Question: >Write a program which accepts a sequence of co...

  • 鸠占鹊巢

    她是个明艳的女子。 她眉若杨柳,目若晨星,她一举一动,都能让人沉迷。 追求她的人无数,却只让我追到了手。 摸着她光...

  • 鸠占鹊巢

    他想说人并不是完全由自己构成的。 比如此刻,他穿着父亲的衬衫,上面始终有股挥之不去的汗水味。他穿着母亲为他缝制的裤...

  • 鸠占鹊巢

    漫道拜金无真情, 马蓉宋喆曾赌命。 沾得铜臭莫惹爱, 可怜卿卿身家名。

  • 鸠占鹊巢

    人皮面具是种江湖传说,人们大多只听过,没见过。 我有幸,不但见过,现在它还戴在我脸上。只是五年了,我终究戴不住,要...

  • 鸠占鹊巢

  • 鸠占鹊巢

    2019年11月28日 多云转晴 周四 每晚八点半,宝贝定的闹钟一响,便开始了她的“减肥计划”。 之...

  • 鸠占鹊巢

    动物界,有两种鸟,布谷鸟,它不会养育不会孵化,就把鸟蛋放到大苇鸟的鸟窝里,让其代为孵化,但是等到破壳,实为布谷鸟的...

网友评论

    本文标题:疯狂的Python-04(鸠占鹊巢)

    本文链接:https://www.haomeiwen.com/subject/akcwwftx.html