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

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

为什么CPython(不知道其他Python实现)有以下行为?


tuple1 = ()

tuple2 = ()                                                                                                   

dict1 = {}

dict2 = {}

list1 = []

list2 = []

# makes sense, tuples are immutable

assert(id(tuple1) == id(tuple2))

# also makes sense dicts are mutable

assert(id(dict1) != id(dict2))

# lists are mutable too

assert(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


ITMISS
浏览 915回答 3
3回答

噜噜哒

当你打电话id({}),Python创建一个dict并将其传递给id功能。这个id函数获取其id(其内存位置),并将其丢弃。那混蛋被毁了。当您快速地连续执行两次时(同时没有创建任何其他DECTS),第二次DECTPython创建的内存恰好与第一次使用相同的内存块。(CPython的内存分配器使得这比听起来更有可能。)自(在CPython中)id使用内存位置作为对象id,两个对象的id是相同的。如果将dict赋值给一个变量,然后得到它的id()因为那些混蛋还活着同时,所以他们id一定不一样。易变性不是直接起作用的,但是代码对象缓存元组和字符串会起作用。在同一个代码对象(函数或类体或模块体)中,将重用相同的文字(整数、字符串和某些元组)。可变对象永远不能被重用,它们总是在运行时创建的。简而言之,对象的id是唯一的对象的生存期..在销毁对象之后,或者在创建对象之前,其他东西可以具有相同的id。

精慕HU

在Jython就不一样了.。>>> id({})1>>> id([])2在通常使用的容器(即空容器)被“拘留”的情况下,是否可以进行优化,以节省分配成本?这一点(在CPython中)并不意味着:>>> def mutateid(obj):...   obj.append('x')...   print obj...   print id(obj)... >>> mutateid([])['x']4299590472>>> id([])4299590472>>> 
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python