Maison >développement back-end >Tutoriel Python >Questions fréquemment posées sur l'entretien Python : la différence entre les types de données mutables et les types de données immuables
Les types de données variables Python et les types de données immuables sont un point de test basique et important. En termes simples : les variables ici sont variables et immuables et indiquent si l'adresse des données changera lorsque la variable change !
Type de données variable : Si la valeur d'une variable est modifiée, cela équivaut à créer un nouvel objet (c'est-à-dire que l'adresse sera modifiée).
Type de données variable : La valeur de la variable change, mais l'adresse de l'objet ne change pas.
Types de données immuables : tuple, chaîne, valeur.
Types de données variables : dictionnaire, liste, ensemble.
Avant de parler de types de données mutables et de types de données immuables, nous devons parler du concept de références. Les variables Python stockent des références à des objets, qui pointent vers des objets dans la mémoire du tas. Les objets alloués dans le tas sont divisés en deux catégories, l'une étant des objets mutables et l'autre étant des objets immuables. Par exemple : s1="abc".
En fait, la variable s1 est une référence à l'objet abc. s1 pointe vers l'adresse mémoire où abc est stocké. Si vous souhaitez voir la valeur d'adresse de s1, vous pouvez utiliser la fonction id. , qui convertira la valeur de l'adresse en décimal. Utilisez simplement print(id(s1)), comme indiqué dans la figure ci-dessous :
Nous utilisons Exemple de chaîne, entrez directement le code :
s1="abc" print(id(s1)) s1="xyz" print(id(s1))
Sortie :
140712532603136 140712532603168
On peut voir sur la sortie que changer la valeur de la variable de type chaîne modifiera également l'adresse.
Regardons ensuite cet exemple, qui est également une question souvent posée lors des entretiens écrits.
#Sur la base du code ci-dessus, écrivez le code suivant :
s2=s1 print(id(s1)) print(id(s2))
Sortie :
743316570224 743316570224
Vous pouvez voir que s2=s1 est en fait s2 et s1 pointent tous vers la même adresse.
Continuons et changeons la valeur de s2.
s2="def" print(id(s1)) print(s1) print(id(s2)) print(s2)
Sortie :
879864758384 xyz 879889887984 def
En voyant cela, nous pouvons comprendre pourquoi changer la valeur de s2 n'affecte pas la valeur de s1. Étant donné que s1 et s2 pointent vers des adresses différentes, la valeur de s1 n’a pas été modifiée !
Nous prenons une liste comme exemple :
l = [1, 2, 3] print(id(l)) l.remove(1) # 删除元素 print(id(l)) l.append(4) # 增加元素 print(id(l)) l[1] = '8' # 修改元素 print(id(l))
Sortie :
405927907912 405927907912 405927907912 405927907912
Vous pouvez voir la liste Lors d'opérations d'ajout, de suppression ou de modification, l'adresse de la liste ne change pas. Elle change uniquement la valeur de la variable, mais ne crée pas de nouvel objet, et l'adresse de l'objet référencé par la variable ne change pas. .
Regardez l'exemple suivant, qui est similaire à l'exemple d'affectation de chaîne précédent.
l1=['a','b','c'] l2=l1 print(id(l1)) print(id(l2)) l2.append('d') print("************") print(id(l1)) print(l1) print(id(l2)) print(l2)
Sortie :
838366483528 838366483528 ************ 838366483528 ['a', 'b', 'c', 'd'] 838366483528 ['a', 'b', 'c', 'd']
Le résultat de la sortie ne sera pas expliqué ici, car les adresses de l1 et l2 sont les mêmes, elles s'influenceront donc mutuellement.
Certains étudiants voudront peut-être demander comment procéder si vous souhaitez copier la liste comme une chaîne et générer deux listes avec la même valeur mais des adresses différentes . Du drap de laine ? En fait, l'essence de ce problème est la différence entre l'attribution directe d'une liste (utilisation = pour l'affectation directe) et la copie (la copie est divisée en copie superficielle et copie approfondie. J'écrirai un autre article pour présenter les connaissances pertinentes sur la copie superficielle). et une copie approfondie en détail. Veuillez continuer à faire attention.
Ici, nous introduisons d'abord une méthode relativement simple pour copier, en utilisant le constructeur list(), le code est le suivant :
l3=['x','y','z'] l4=list(l3) print(id(l3)) print(id(l4)) l4.append('a') print(l3) print(l4)
Sortie :
831456302152 831480344136 ['x', 'y', 'z'] ['x', 'y', 'z', 'a']#🎜 🎜# Comme le montrent les résultats, les adresses de l3 et l4 sont différentes, elles ne s'affecteront donc pas. Nous pouvons également faire pointer les deux listes vers des objets de liste différents en utilisant des index, la génération de listes, copy(), etc., que je ne présenterai pas un par un ici !
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!