当前位置: 首页 > 面试题库 >

为什么较大的int数返回不同的ID,有时返回相同的ID?

桂玉石
2023-03-14
问题内容

今天,我了解id并决定将其使用和测试。我知道整数是不可变的,因此id应该是(?)相同。但是,当我在提示中进行测试时,我注意到了一些细微的差异,并想找出其背后的原因。

a = 1
id(a)    # 10055552
id(1)    # 10055552
a = int(1)
id(a)    # 10055552

凉!到目前为止,所有签出。但是之后…

a = 10000
id(a)           # 140230117375888
id(10000)       # 140230116779920
a = int(10000)
id(a)           # 140230116779920

# wait what?? try it again
id(10000)       # 140230116780080
# Huh!?

好的,所以测试一下,我注意到此行为一直持续到256年。id最多可以是8位数字,然后257将返回更大的id,可以是15位数字。因此int类型必须是8个字节。

a = 256
id(a)     # 10063712
id(256)   # 10063712

a = 257
id(a)     # 140230116780080
id(257)   # 140230117375888
a = int(257)
id(a)     # 140230117375888
id(257)   # 140230116779920

所以我发现它与8个字节长有关,但是任何大于256的东西都会重新使用某些相同的id:

140230116780080
140230116780048
140230116780144
140230117375888
140230116779920

请注意,以上列表并不详尽。

引擎盖下面发生了什么?为什么某些ID被重复使用?测试多个变量:

a = 257
b = 258
c = 259

id(a)      # 140230116780176
id(257)    # 140230116779984   <--- reused?
id(b)      # 140230116780080
id(258)    # 140230116780144
id(c)      # 140230116780048
id(259)    # 140230116779984   <--- reused?

id(257) == id(259)    # False

TL; DR-
对于大于256的整数,为什么要重用某些ID?我以为这些ID在他们的一生中应该是唯一的,但是其中一些ID看起来一样,但是在比较它们时,它们是不同的吗?请查看提供的最后一个html" target="_blank">示例。

另外,为什么对于这些​​较大的整数使用少数几个ID?对于使用更多变量的系统,这可能有所不同吗?

在Python 3.4.3,Linux上的GCC 4.8.4上进行了测试。


问题答案:

作为一种优化,Python会预先创建一系列int对象(我认为默认情况下为-5 …
256,这是一个编译时选项),并且始终优先使用这些对象来创建新的int。对于超出此范围的int,再次需要完全相同的int的机会被认为太低,因此不值得花精力检查所需的int对象是否已经存在。

这纯粹是一个实现细节。如果您的代码实际上关心过它,那么您就在做某件事。



 类似资料:
  • } 我得到了下面的结果。但是在这个结果中,高亮显示的行具有相同的列名,但是别名不同。为什么hibernate会得到相同的Cloumn? 冬眠:删除表,如果存在hibernate_sequence hibernate:删除表(如果存在)UserDetails Hibernate:如果存在,则删除表车辆Hibernate:创建表hibernate_sequence(next_val bigint)En

  • 我正在使用Microsoft Graph Users API根据我们的ActiveDirectory验证用户名或电子邮件地址列表。名称搜索: https://graph.microsoft.com/v1.0/me/people/?$search=John.Smith 返回其他数据,如和。但如果我使用电子邮件搜索: null 我是否需要额外的权限来获取相同的数据? 更新:我按照下面的建议在https

  • 问题内容: 我在某处读到,函数应始终仅返回一种类型,因此以下代码被视为错误代码: 我想更好的解决方案是 返回None然后创建一个新的空元组不是更便宜的内存明智的选择吗?或者即使在较大的项目中,这种时差也太小而无法引起注意? 问题答案: 为什么函数应该返回一致类型的值?满足以下两个规则。 规则1-函数具有“类型”-输入映射到输出。它必须返回一致的结果类型,否则它不是函数。一团糟。 从数学上讲,我们说

  • 问题内容: 我运行了跟随脚本(java),它给了我奇怪的结果。有人可以帮忙解释吗? 记录结果(彼此不同): - - 背景 - - 我想将自己的keyGenrator用于@Cacheable批注(Spring和ehCache)。 在这种情况下,我发现缓存总是丢失的。 然后,我必须更改为: 谢谢 问题答案: 这是因为for 不会被覆盖。即使条目相同,也没有理由为什么的两个实例应该具有相同的值。 试试这

  • 问题内容: 我正在阅读Head First Java的书中的一句话: 关键是哈希码可以相同,而不必保证对象相等,因为该方法中使用的“哈希算法” 可能会为多个对象返回相同的值。 为什么该方法可能为不同的对象返回相同的值?这不会引起问题吗? 问题答案: *对对象进行 *散列 意味着“ 找到可以由相同实例一次又一次地再现的良好的描述性值(数字) ”。由于Java的哈希码类型为,因此只能具有不同的值。这就

  • 当我执行普通Select时,返回正确的结果,但当我执行Select for DB uptime时,它始终返回相同的第一个结果。我确实检查了Postgres日志,我看到select被执行了。