Python 非字符串的内部机制
为什么Python的intern
这个内置功能只针对字符串呢?其实,intern
应该可以扩展到那些可以被哈希和比较的类,对吧?
3 个回答
0
只有字符串被支持,因为字符串的“驻留”功能依赖于一种基于指针的对象身份测试。其他类型的类的哈希值可以进行比较,但这些对象本身在身份测试中永远不会匹配。原因是,即使它们可能看起来相同,但它们并不是同一个对象。
1
其实没有什么技术上的原因说元组不能被“内存共享”,不过我觉得在实际应用中,这样做的价值可能远不如字符串常量。而对于用户自己定义的类型来说,这样做的实际价值就更小了。所以让元组也能这样做,可能被认为不值得花时间去实现。
14
把东西进行“驻留”的目的是为了通过比较它们的内存地址来判断它们是否相同;这样可以确保你不会创建两个值相同的对象(当程序请求创建一个值与已有对象相同的第二个对象时,它会得到一个指向已有对象的引用)。这就要求你驻留的东西是不可变的;如果一个驻留对象的值可以改变,那么通过地址来比较就不靠谱了。
在Python中,用户自己定义的类实例是无法保证不可变的,所以把它们驻留是不安全的。我觉得这就是为什么驻留不适用于类实例的主要理论原因。
其他内置的不可变类型要么已经可以通过单个机器级操作进行比较(比如int、float等),要么是可以包含可变值的不可变容器(比如元组、冻结集合)。前者不需要驻留,而后者也不能安全地驻留。