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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |