我能够理解python的不变性(也非常简单)。假设我为
指定了一个数字x = 42
print(id(x))
print(id(42))
在两个方面,我得到的值是
505494448
我的问题是,python解释器是否在环境加载之前将内存中的所有数字,字母,True / False分配给id?如果没有,ids如何跟踪?或者我是以错误的方式看待这个?有人可以解释一下吗?
答案 0 :(得分:6)
您所看到的是调用实习的实施细节(内部优化)。这是一种技术(由许多语言(包括Java和Lua)的实现使用),它将名称或变量别名作为对可能或可行的单个对象实例的引用。
你不应该依赖这种行为。它不是语言的正式规范的一部分,并且不保证对字符串或整数的单独文字引用将被实现,也不保证产生给定对象的给定操作集(字符串或数字)将对其他相同的对象进行实例化。 / p>
我听说C Python实现确实包含了一组大约一百个左右的整数作为静态实例化的不可变对象。我怀疑其他非常高级的语言运行时库可能包含类似的优化:大多数非平凡的代码片段经常使用前100个整数。
就如何实现这些事情而言......对于字符串和更大的整数,Python将这些作为字典维护是有意义的。因此,任何产生整数(甚至可能是浮点数)和字符串(至少足够短的字符串)的表达式都将被散列,在适当的(内部)对象字典中查找,必要时添加,然后作为对结果对象的引用返回。 / p>
通过将实例化包装在您自己的类静态字典中,您可以对自己喜欢的任何类型的自定义对象进行类似的实习。