Maison >développement back-end >Tutoriel Python >Analyse détaillée des objets mutables et immuables Python
Tout en Python peut être considéré comme un objet. Chaque objet a son propre identifiant, son type et sa valeur.
Le fait qu'un objet soit mutable ou non dépend du fait que la valeur prenne en charge les modifications.
Recommandations d'apprentissage associées : Tutoriel vidéo Python
Objets immuables
Objet d'immuabilité commune (immuable objets):
Ressentons-le à travers un exemple
Exemple
>>> x=1 >>> y=x >>> id(x)==id(y) True >>> id(1)==id(y) True
Ici, deux objets int sont créés, et laissez x, y pointe vers le même objet, puis nous essayons de modifier x pour que x+1
>>>x=x+1
À ce moment, la valeur id de x est toujours la même que l'identifiant de y et l'identifiant de 1 ?
>>> x=x+1 >>> id(x)==id(y) False >>> id(x)==id(1) False >>> id(1)==id(y) True
Il n'est pas difficile de voir à partir des résultats que l'objet pointé par x a changé, mais 1 n'a pas changé. Il s'agit d'un objet immuable. Pour les objets immuables, une fois créés, ils ne peuvent pas être modifiés.
Remarque : l'immuabilité n'est pas strictement équivalente à l'immuabilité absolue
>>> a=([1],2,3) >>> id(a) 4338862696 >>> id(a[0]) 4338949128 >>> a[0][0]=0 >>> id(a) 4338862696 >>> id(a[0]) 4338949128
Il n'est pas difficile de voir à partir de l'exemple ci-dessus que nous avons modifié la valeur de a[0], mais cela n'a pas affecté sa valeur d'identification. Si un objet conteneur immuable contient une référence à un objet mutable, lorsque la valeur de ce dernier change, la valeur du premier changera également mais le conteneur est toujours un objet immuable car sa valeur d'identifiant ne changera pas ;
Objets mutables
Objets mutables communs :
Expérimentez-le de la même manière à travers des exemples
Exemple
>>> c = [1,2,3] >>> b = c >>> id(b)==id(c) True
Créez deux objets de liste et laissez c, d pointer vers le même objet , puis nous essayons de modifier c
c[0]=4
A ce moment, vérifiez si les valeurs d'identifiant des deux objets sont cohérentes
>>> id(c)==id(b) True
Après modification, c, d pointe toujours vers le même objet, il n'est donc pas difficile de conclure que pour un objet mutable, la modification de la valeur n'aura aucun impact sur son identifiant
Paramètres de fonction
Pour les objets mutables et objets immuables, ils se comportent différemment lorsque les fonctions sont passées en paramètres
Exemple
eg0
def update_list(nums_list): print(f'2 id:{id(nums_list)}') nums_list += [10] print(f'3 id:{id(nums_list)}') number_list = [5, 6] print(f'1:{number_list}, id:{id(number_list)}') update_list(number_list) print(f'4:{number_list}, id:{id(number_list)}')
Regardez les résultats
1:[5, 6], id:4457707912
2 id:4457707912
3 id:4457707912
4:[5, 6, 10], id :4457707912
En regardant un autre exemple
eg1
def add_num(number): print(f'2:{id(number)}') number += 1 print(f'3:{id(number)}') num = 1 print(f'1:{num}, id:{id(num)}') add_num(num) print(f'4:{num}, id:{id(num)}')
En regardant voici les résultats
1 :1, id:4343768416
2 id:4343768416
3 id:4343768448
4:1, id:4343768416
Dans certains autres articles, eg0 ci-dessus est appelé passer par référence, et eg1 est appelé passage par valeur. Cependant, dans les documents officiels, aucun contenu lié à ces deux termes n'a été trouvé, ou cette méthode n'est aucune des deux ci-dessus.
Le point clé ici est : Pour les objets mutables, les modifications de la valeur dans la fonction entraîneront une modification de l'objet ; pour les objets immuables, les modifications de la valeur dans la fonction n'entraîneront aucune modification. l'objet.Impact
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!