Des objets immuables n'ont pas le même id
, et comme une mater de fait, ce n'est pas vrai pour n'importe quel type d'objets que vous pouvez définir séparément. Chaque fois que vous définissez un objet en Python, vous allez créer un nouvel objet avec une nouvelle identité.
Mais il existe quelques exceptions pour les petits entiers (entre -5 et 256) et de petites chaînes (internés cordes, avec une longueur spéciale (généralement moins de 20 caractères)) qui sont des singletons et ont même id
(en fait un objet avec plusieurs pointeur). Vous pouvez vérifier ce fait comme suit:
>>> 30 is 20 + 10
True
>>>
>>> 300 is 200 + 100
False
>>> 'aa' * 2 is 'a' * 4
True
>>> 'aa' * 20 is 'a' * 40
False
Et pour un objet personnalisé:
>>> class A:
... pass
...
>>> A() is A() # Every time you create an instance you'll have a new instance with new identity
False
Notez également que l' is
opérateur de vérifier l'identité de l'objet, non pas la valeur. Si vous voulez vérifier la valeur que vous devez utiliser ==
:
>>> 300 == 3*100
True
Et depuis il n'y a aucune règle pour les n-uplets (autres types) si vous définissez les deux même tuples dans n'importe quelle taille ils vont obtenir leur propre id:
>>> a = (1,)
>>> b = (1,)
>>>
>>> a is b
False
Et notez que le fait de singleton entiers et internés de chaînes de caractères est vrai même lorsque vous les définir dans mutable et des objets immuables:
>>> a = (100, 700, 400)
>>>
>>> b = (100, 700, 400)
>>>
>>> a[0] is b[0]
True
>>> a[1] is b[1]
False