Python : Opérateur in et méthodes get(), copy() et clear()
Tester l'existence d'une clé
personne = {
'nom': 'dupont',
'prenom': 'jean'
}
print(personne['age']) # KeyError: 'age'
La plupart du temps ce n'est pas souhaitable et pour cette raison nous utilisons l'opérateur in ou la méthode get().
Utilisation de l'opérateur in
Le plus souvent nous utiliserons l'opérateur in pour vérifier l'existence d'une clé dans un dictionnaire :
personne = {
'nom': 'dupont',
'prenom': 'jean'
}
if 'age' in personne:
print(personne['age'])
else:
print('Pas d\'âge')
Utilisation de la méthode get()
La méthode get() permet d'accéder à la valeur associée à une clé dans un dictionnaire mais ne retourne pas d'erreur si la clé n'existe pas :
personne = {
'nom': 'dupont',
'prenom': 'jean'
}
print(personne.get('age')) # None
On peut également indiquer à .get() une valeur par défaut en deuxième argument :
personne = {
'nom': 'dupont',
'prenom': 'jean'
}
print(personne.get('age', 0)) # 0
La méthode clear()
La méthode clear() permet de supprimer tous les éléments d'un dictionnaire.
personne = {
'nom': 'dupont',
'prenom': 'jean'
}
personne.clear()
print(personne) # {}
Copier un dictionnaire
Pour la même raison que les listes, il faut faire la différence entre copie superficielle et copie profonde.
Copie superficielle d'un dictionnaire
La méthode copy() permet de créer une copie superficielle pour les dictionnaires contenant uniquement des valeurs immuables.
personne = {
'nom': 'dupont',
'prenom': 'jean'
}
personne2 = personne.copy()
print(personne) # {'nom': 'dupont', 'prenom': 'jean'}
print(personne2) # {'nom': 'dupont', 'prenom': 'jean'}
print(personne is personne2) # False
print(personne == personne2) # True
La copie superficielle est bien un objet différent du dictionnaire copié qui comprend les mêmes paires de clé / valeur.
Copie profonde d'un dictionnaire
La méthode copy() permet de créer une copie superficielle pour les dictionnaires contenant uniquement des valeurs immuables.
Pour rappel, si un type mutable se trouve dans le dictionnaire copié, une copie par référence sera effectuée. Cela entraînera qu'une modification de l'objet sera répercuté dans toutes les copies superficielles également, et réciproquement :
personne = {
'nom': 'dupont',
'prenom': 'jean',
'adresse': {
'ville': 'paris'
}
}
personne2 = personne.copy()
personne['adresse']['ville'] = 'lyon'
print(personne)
# {'nom': 'dupont', 'prenom': 'jean', 'adresse': {'ville': 'lyon'}}
print(personne2)
# {'nom': 'dupont', 'prenom': 'jean', 'adresse': {'ville': 'lyon'}}
Il faut donc effectuer une copie profonde dans ce cas :
import copy
personne = {
'nom': 'dupont',
'prenom': 'jean',
'adresse': {
'ville': 'paris'
}
}
personne2 = copy.deepcopy(personne)
personne['adresse']['ville'] = 'lyon'
print(personne)
# {'nom': 'dupont', 'prenom': 'jean', 'adresse': {'ville': 'lyon'}}
print(personne2)
# {'nom': 'dupont', 'prenom': 'jean', 'adresse': {'ville': 'paris'}}