加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python-numpy.float64对象的id()是相同的,即使它们的值不同?

发布时间:2020-12-20 12:09:52 所属栏目:Python 来源:网络整理
导读:参见英文答案 Why is the id of a Python class not unique when called quickly?????????????????????????????????????6个 我得到以下内容: import numpyprint id(numpy.float64(100)) == id(numpy.float64(10))print numpy.float64(100) == numpy.float64
参见英文答案 > Why is the id of a Python class not unique when called quickly?????????????????????????????????????6个
我得到以下内容:

import numpy
print id(numpy.float64(100)) ==  id(numpy.float64(10))
print numpy.float64(100) == numpy.float64(10)

得到:

True
False

请注意,如果我创建两个float64对象,然后比较它们,它似乎按预期工作:

a = numpy.float64(10)
b = numpy.float64(100)
print a==b,id(a)==id(b)

得到:

False
False

基于https://docs.python.org/2/reference/datamodel.html,如果它们的值不同,两个对象的id是否总是不同?如果值不同,我怎样才能获得匹配的id?

这是numpy中的某种错误吗?

解决方法

这看起来像是内存重用的怪癖,而不是NumPy错误.

这条线

id(numpy.float64(100)) == id(numpy.float64(10))

首先创建一个浮动numpy.float64(100)然后调用它上面的id函数.然后Python的垃圾收集器立即释放这个内存,因为没有更多的引用它.内存槽可以由任何创建的新对象自由重用.

当创建numpy.float64(10)时,它占用相同的内存位置,因此id返回的内存地址相等.

当您查看字节码时,这一系列事件可能更清晰:

>>> dis.dis('id(numpy.float64(100)) ==  id(numpy.float64(10))')
  0 LOAD_NAME                0 (id)
  3 LOAD_NAME                1 (numpy)
  6 LOAD_ATTR                2 (float64)
  9 LOAD_CONST               0 (100)
 12 CALL_FUNCTION            1 (1 positional,0 keyword pair) # call numpy.float64(100)
 15 CALL_FUNCTION            1 (1 positional,0 keyword pair) # get id of object

 # gc runs and frees memory occupied by numpy.float64(100)

 18 LOAD_NAME                0 (id)                   
 21 LOAD_NAME                1 (numpy)
 24 LOAD_ATTR                2 (float64)
 27 LOAD_CONST               1 (10)
 30 CALL_FUNCTION            1 (1 positional,0 keyword pair) # call numpy.float64(10)
 33 CALL_FUNCTION            1 (1 positional,0 keyword pair) # get id of object

 36 COMPARE_OP               2 (==) # compare the two ids 
 39 RETURN_VALUE

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读