为了账号安全,请及时绑定邮箱和手机立即绑定

为什么在CPython中id({})=id({})和id([])=id([])?

为什么在CPython中id({})=id({})和id([])=id([])?

ITMISS 2019-07-03 10:31:31
为什么在CPython中id({})=id({})和id([])=id([])?为什么CPython(不知道其他Python实现)有以下行为?tuple1 = ()tuple2 = ()                                                                                                   dict1 = {}dict2 = {}list1 = []list2 = []# makes sense, tuples are immutableassert(id(tuple1) == id(tuple2))# also makes sense dicts are mutableassert(id(dict1) != id(dict2))# lists are mutable tooassert(id(list1) != id(list2))assert(id(()) == id(()))# why no assertion error on this?assert(id({}) == id({}))# or this?assert(id([]) == id([]))我有一些想法可以,可能,但却找不到混凝土原因何在。编辑为了进一步证明格伦和托马斯的观点:[1] id([])4330909912[2] x = [][3] id(x)4330909912[4] id([])4334243440
查看完整描述

3 回答

?
噜噜哒

TA贡献1784条经验 获得超7个赞

当你打电话id({}),Python创建一个dict并将其传递给id功能。这个id函数获取其id(其内存位置),并将其丢弃。那混蛋被毁了。当您快速地连续执行两次时(同时没有创建任何其他DECTS),第二次DECTPython创建的内存恰好与第一次使用相同的内存块。(CPython的内存分配器使得这比听起来更有可能。)自(在CPython中)id使用内存位置作为对象id,两个对象的id是相同的。如果将dict赋值给一个变量,然后得到它的id()因为那些混蛋还活着同时,所以他们id一定不一样。

易变性不是直接起作用的,但是代码对象缓存元组和字符串会起作用。在同一个代码对象(函数或类体或模块体)中,将重用相同的文字(整数、字符串和某些元组)。可变对象永远不能被重用,它们总是在运行时创建的。

简而言之,对象的id是唯一的对象的生存期..在销毁对象之后,或者在创建对象之前,其他东西可以具有相同的id。


查看完整回答
反对 回复 2019-07-03
?
精慕HU

TA贡献1845条经验 获得超8个赞


在Jython就不一样了.。


>>> id({})

1

>>> id([])

2

在通常使用的容器(即空容器)被“拘留”的情况下,是否可以进行优化,以节省分配成本?


这一点(在CPython中)并不意味着:


>>> def mutateid(obj):

...   obj.append('x')

...   print obj

...   print id(obj)

... 

>>> mutateid([])

['x']

4299590472

>>> id([])

4299590472

>>> 


查看完整回答
反对 回复 2019-07-03
  • 3 回答
  • 0 关注
  • 914 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信