2017-06-27 30 views
0

据我所知,python将通过指向两个等价对象的内存中的相同对象来节省某些不可变类型。如声明变量,以相同数量的(-5和边界256内):相同的不可变元组指向不同的对象

i = 5 
j = 5 
i is j 
>> True 

...和集:

tuple1 =() 
tuple2 =() 
tuple1 == tuple2 
>> True 
tuple1 is tuple2 
>> True 

由于集(不可变型)可以包含可变类型,例如作为可修改的列表,我明白了Python不想指向同一个对象的情况一样:

tuple3 = ([1, 2, 3], a, b) 
tuple4 = ([1, 2, 3], a, b) 
tuple3 is tuple4 
>> False 

...为什么下面的元组不会指向同一个对象Ť据我所知,嘿都是在所有条件下都不变的?

tuple5 = ((),()) 
tuple6 = ((),()) 
tuple5 == tuple6 
>> True 
tuple5 is tuple6 
>> False 
+2

寻找特定实现以某种方式完成的原因通常是愚蠢的错误,特别是当强调细节可能随时间变化并且在实现中发生变化时(如此处所示)。我们无法获得做出这些决定的程序员会议,而制作香肠并不总是很美。 –

+0

你正在讨论元组,而不是集合。 – chepner

回答

0

当Python引擎认为该对象足够简单以保证在简单常量的运行时表中进入时,指针被折叠。这个表格通常包含小整数(例如-256到255),内置类型的空/空对象以及类似的琐事。

更复杂的对象 - 由设计Python实现者定义 - 在每个引用处重建。因此,你可能会发现,

a = 1 
b = 1 

指同一对象,但

a = 123456798 
b = 123456798 

有独立的分配。

+0

这将是CPython中的* -5到256 *。 –

+1

感谢您的回答。我熟悉Python如何优化整数;然而,指向对象的不可变类型的某些规则仍然让我困惑。我明白,正如Rory Daulton先生恰当地指出的那样,Python的创建者无法解释每一个具体的案例。 –

+0

你能描述/划定什么仍然让你困惑吗? Rory的主要观点(也是我的观点)是,对于常量得到特殊处理的实际是* not * Python规则 - 这个决定留给那些实现Python的人来决定。 – Prune

相关问题