2017-06-27 2 views
0

Je comprends que python économisera avec certains types immuables en pointant vers le même objet en mémoire pour deux objets équivalents. Tels que la déclaration des variables au même nombre (dans les limites de -5 et 256):Les tuples identiques non modifiables pointent vers différents objets

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

... et ensembles:

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

ensembles Parce que (type immuable) peuvent contenir des types mutables tels sous forme de listes qui peuvent être modifiés, je comprends que Python ne voudrais pas pointer vers le même objet que dans le cas:

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

... Comment viennent les tuples suivants ne pointent pas vers le même objet que t Ils sont tous les deux, à ma connaissance, immuables dans toutes les conditions?

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

Il est généralement inutile de chercher les raisons pour lesquelles une implémentation particulière a été faite d'une certaine manière, surtout quand on souligne que les détails peuvent varier dans le temps et dans l'implémentation, comme c'est le cas ici. Nous n'avons pas accès aux réunions de programmeurs où de telles décisions sont prises, et la fabrication de la saucisse n'est pas toujours jolie. –

+0

Vous parlez de tuples, pas d'ensembles. – chepner

Répondre

0

Les pointeurs sont pliés lorsque, de l'avis du moteur Python, l'objet est assez simple pour justifier l'entrée dans la table de l'exécution des constantes simples. Cette table inclut souvent de petits entiers (tels que -256 à 255), des objets vides/nuls de types prédéfinis et des trivialités similaires.

Des objets plus complexes - tels que définis par ceux qui ont conçu l'implémentation Python - sont reconstruits à chaque référence. Ainsi, vous trouverez peut-être que

a = 1 
b = 1 

Référez-vous au même objet, mais

a = 123456798 
b = 123456798 

allocations distinctes Avoir.

+0

Cela serait de * -5 à 256 * dans CPython. –

+1

Merci pour votre réponse. Je suis familier avec la façon dont Python optimise pour les entiers; Cependant, certaines règles pour les types immuables pointant vers des objets me confondent encore. Je comprends que les créateurs de Python ne peuvent pas rendre compte de chaque cas spécifique, comme l'a justement noté M. Rory Daulton. –

+0

Pouvez-vous décrire/délimiter ce qui vous trouble encore? Le point principal de Rory (aussi le mien) est qu'il y a vraiment des règles * pas * Python pour lesquelles les constantes reçoivent un traitement spécial - cette décision est laissée à ceux qui implémentent Python. – Prune