python - 为什么两个单独创建的不可变对象(immutable对象)具有相同的 id 而可变对象具有不同的同时都引用相同的值?

标签 python immutability identifier concept mutability

<分区>

两个单独创建的可变列表具有不同的 id。

Python SHELL:(可变)

>>> mylist = ['spam', 'eggs']
>>> yourlist = ['spam', 'eggs']
>>> id(mylist), id(yourlist)
(49624456, 48910408)

虽然两个单独创建的不可变字符串具有相似的 id。

Python SHELL:(不可变)

>>> a = 10
>>> b = 10
>>> id(a), id(b)
(507099072, 507099072)

ab 是否引用同一个对象?如果不是,为什么 ID 相似? mylistyourlist 引用的是不同的对象吗?如果是,为什么他们有不同的 ID。

最佳答案

Python 缓存了一些小的字符串和数字:http://docs.python.org/2/c-api/int.html#PyInt_FromLong

The current implementation keeps an array of integer objects for all integers between -5 and 256, when you create an int in that range you actually just get back a reference to the existing object.

id(some_list) 总是给你容器的地址——内存中的列表对象,而不是列表中的字符串!

关于python - 为什么两个单独创建的不可变对象(immutable对象)具有相同的 id 而可变对象具有不同的同时都引用相同的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21091568/

相关文章:

python - 将文件夹压缩成多个部分?

python - 识别 python DataFrame 中相等的行...

ios - 导致 "Cannot pass immutable as inout"的 Swift 3 转换

python - 如何检查标识符是 dunder 还是 class-private(即会被破坏)?

Python:如何创建用于字符串匹配的查找表

Python 多处理不在 Fedora 中创建新进程

swift - 在非类绑定(bind)协议(protocol)的扩展中,实例必须被视为值类型

javascript - Redux 'connect' 未检测到状态数组更改

android - Android模拟器的设备标识符

azure - 从 Azure AD 中获取用户的 token 主题标识符 (sub)