Maison  >  Article  >  développement back-end  >  Pourquoi les valeurs par défaut sont-elles partagées entre les objets en Python ?

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

王林
王林avant
2023-08-20 19:33:231082parcourir

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

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={}):
   ...

Utilisez des objets immuables comme Aucun -

def foo(mydict=None):
   if mydict is None:
      mydict = {}

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

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

_cache[(arg1, arg2)] = result

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer