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

WBOY
Libérer: 2023-05-19 16:04:06
avant
1201 Les gens l'ont consulté

Python 面试高频问题:可变数据类型和不可变数据类型的区别

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.

Quote

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 :

Python 面试高频问题:可变数据类型和不可变数据类型的区别

Type de données immuable

Nous utilisons Exemple de chaîne, entrez directement le code :

s1="abc"
print(id(s1))
s1="xyz"
print(id(s1))
Copier après la connexion

Sortie :

140712532603136
140712532603168
Copier après la connexion

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))
Copier après la connexion

Sortie :

743316570224
743316570224
Copier après la connexion

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)
Copier après la connexion

Sortie :

879864758384
xyz
879889887984
def
Copier après la connexion

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 !

Type de données variable

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))
Copier après la connexion

Sortie :

405927907912
405927907912
405927907912
405927907912
Copier après la connexion

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)
Copier après la connexion

Sortie :

838366483528
838366483528
************
838366483528
['a', 'b', 'c', 'd']
838366483528
['a', 'b', 'c', 'd']
Copier après la connexion

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.

Copie de liste

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)
Copier après la connexion

Sortie :

831456302152
831480344136
['x', 'y', 'z']
['x', 'y', 'z', 'a']
Copier après la connexion
#🎜 🎜# 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!

Étiquettes associées:
source:51cto.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal