Pourquoi les valeurs par défaut sont-elles partagées entre les objets en Python ?

王林
Libérer: 2023-08-20 19:33:23
avant
1120 Les gens l'ont consulté

Pourquoi les valeurs par défaut sont-elles partagées entre les objets en Python ?

Le concept de valeurs par défaut en Python est basé sur l'utilisation d'objets mutables ou immuables. Dans la pratique de la programmation, il est préférable de ne pas utiliser d'objets mutables comme valeurs par défaut. Utilisez plutôt Aucun comme valeur par défaut pour éviter les problèmes. Les objets immuables, tels que les nombres, les chaînes, les tuples et None, ne changent pas. Pour les objets mutables tels que les dictionnaires, les listes et les instances de classe, les modifications peuvent prêter à confusion.

Regardons un exemple de dictionnaire dans une fonction et ses problèmes et comment y remédier.

Question

Nous avons une fonction. Dans cette fonction, nous avons un dictionnaire comme paramètre et définissons la valeur par défaut. La première fois que cette fonction est appelée, mydict ne contient qu'un seul élément. Lors du deuxième appel, mydict contient deux éléments car lorsque foo() a commencé à s'exécuter, mydict avait déjà un élément.

def foo(mydict={}):
   ... calculate...
   mydict[key] = value
   return mydict
Copier après la connexion

Nous nous attendons souvent à ce que les appels de fonction créent de nouveaux objets avec des valeurs par défaut. Cependant, ce n’est pas le cas. Les valeurs par défaut ne sont créées qu'une seule fois lorsque la fonction est définie. Si l'objet est modifié, comme dans l'exemple de dictionnaire ci-dessus, les appels suivants à la fonction feront référence à l'objet modifié.

Solution

Pour résoudre le problème de l'utilisation d'objets mutables comme valeurs par défaut, comme ceci -

def foo(mydict={}):
   ...
Copier après la connexion

Utilisez des objets immuables comme Aucun -

def foo(mydict=None):
   if mydict is None:
      mydict = {}
Copier après la connexion

Lorsque vous avez une fonction coûteuse en calcul, une technique consiste à mettre en cache les valeurs d'argument et de résultat pour chaque appel à la fonction, et à renvoyer les valeurs mises en cache lorsque les mêmes valeurs sont à nouveau demandées.

C'est ce qu'on appelle la mémorisation et peut être réalisé comme ça -

# Callers can only provide two parameters and optionally pass _cache by keyword
def expensive(arg1, arg2, *, _cache={}):
   if (arg1, arg2) in _cache:
      return _cache[(arg1, arg2)]

  # Calculate
  result = ... expensive computation ...
  _cache[(arg1, arg2)] = result
  return result
Copier après la connexion

Ce qui suit stocke les résultats dans le cache −

_cache[(arg1, arg2)] = result
Copier après la connexion

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:tutorialspoint.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