Table des matières
Pourquoi les références faibles existent
Quand devriez-vous utiliser des références faibles?
1. Éviter les fuites de mémoire dans les caches ou les mappages
2. Relations parent-enfant ou circulaires
3. Cache sans ballonnement de mémoire
Points clés pour se souvenir
Maison développement back-end Tutoriel Python Qu'est-ce qu'une référence faible dans Python et quand devriez-vous l'utiliser?

Qu'est-ce qu'une référence faible dans Python et quand devriez-vous l'utiliser?

Aug 01, 2025 am 06:19 AM
python référence faible

Des références faibles existent pour permettre la référence à des objets sans empêcher leur collection de déchets, aidant à éviter les fuites de mémoire et les références circulaires. 1. Utilisez la dictionnaire faible ou la valeur faible pour les caches ou les mappages pour permettre aux objets inutilisés d'être collectés. 2. Utilisez des références faibles dans les relations d'enfant à parent pour casser les cycles et permettre aux parents d'être supprimés. 3. Utilisez une valeur faible pour la mise en cache où les entrées devraient disparaître lorsque les objets ne sont plus nécessaires ailleurs. Vérifiez toujours si une référence faible ne le renvoie pas, car l'objet peut avoir été collecté, et n'oubliez pas qu'ils ne fonctionnent qu'avec des objets qui prennent en charge le référencement faible, tels que les classes définies par l'utilisateur.

Qu'est-ce qu'une référence faible dans Python et quand devriez-vous l'utiliser?

Une référence faible dans Python est une référence à un objet qui n'augmente pas le nombre de références de l'objet. Cela signifie que l'objet peut être collecté des ordures même si une référence faible existe toujours. En revanche, les références normales (fortes) gardent des objets vivants tant que ces références existent.

Qu'est-ce qu'une référence faible dans Python et quand devriez-vous l'utiliser?

Pourquoi les références faibles existent

Python utilise le comptage des références dans le cadre de sa gestion de la mémoire. Lorsque le nombre de références d'un objet tombe à zéro, il est immédiatement éligible à la collecte des ordures. Mais parfois, vous voulez vous référer à un objet sans l'empêcher d'être nettoyé lorsqu'il n'est plus nécessaire ailleurs. C'est là que les références faibles entrent en jeu.

Vous créez une référence faible en utilisant le module weakref :

Qu'est-ce qu'une référence faible dans Python et quand devriez-vous l'utiliser?
 Importer des faibles

Classe MyClass:
    passer

obj = myClass ()
Faible_ref = Filef.Ref (OBJ)

print (faible_ref ()) # Renvoie l'objet s'il est toujours vivant
Del Obj
imprimer (faible_ref ()) # Renvoie maintenant aucun - l'objet a été collecté

Quand devriez-vous utiliser des références faibles?

1. Éviter les fuites de mémoire dans les caches ou les mappages

Si vous stockez des références à des objets dans un cache ou un dictionnaire, de fortes références peuvent involontairement maintenir des objets grands ou temporaires en vie.

Exemple: suivi des rappels ou des auditeurs

Qu'est-ce qu'une référence faible dans Python et quand devriez-vous l'utiliser?
 Importer des faibles

# Stocker les rappels faiblement afin qu'ils n'empêchent pas le nettoyage
rappels = faiblerref.weakKeyDictionary ()

def on_cleanup (obj):
    imprimer ("l'objet a disparu:", obj)

obj = myClass ()
rappels [obj] = on_cleanup # La touche est faible - lorsque l'OBJ décède, l'entrée est supprimée
Entrée del obj # supprimée automatiquement des rappels

WeakKeyDictionary utilise des références faibles pour les clés. La WeakValueDictionary fait de même pour les valeurs - utiles pour les caches.

2. Relations parent-enfant ou circulaires

Lorsqu'un parent tient aux enfants et que les enfants ont besoin d'une référence au parent, une forte référence dans les deux directions crée un cycle. L'utilisation d'une référence faible pour le lien d'enfant à parent évite cela.

 Enfant de classe:
    def __init __ (self, parent):
        self.parent = faibleref.ref (parent) # référence faible

    def get_parent (self):
        p = self.parent ()
        Si P n'est pas aucun:
            retour p
        autre:
            imprimer ("le parent a été supprimé")
            Renvoie aucun

Maintenant, lorsque le parent est supprimé, l'enfant ne le gardera pas en vie.

3. Cache sans ballonnement de mémoire

Vous pouvez utiliser weakref.WeakValueDictionary pour construire un cache où les entrées disparaissent lorsque les objets ne sont plus utilisés ailleurs.

 Importer des faibles

_instance_cache = webref.weakValuedictionary ()

def get_instance (clé):
    obj = _instance_cache.get (key)
    Si OBJ n'est aucun:
        obj = myClass ()
        _instance_cache [key] = obj
    Retour OBJ

Si aucune autre partie du programme ne contient une référence à l'instance, elle est collectée aux ordures et l'entrée de cache est automatiquement supprimée.


Points clés pour se souvenir

  • Les références faibles ne sont pas toujours appropriées - elles ne le retournent None si l'objet a disparu, vous devez donc vérifier.
  • Ils travaillent uniquement avec des objets qui prennent en charge le référencement faible (la plupart des classes définies par l'utilisateur font; certains types intégrés comme list ou dict ne le font pas).
  • Utilisez weakref.ref , WeakKeyDictionary , WeakValueDictionary ou WeakSet en fonction de votre cas d'utilisation.
  • Ils aident à rompre les cycles de référence et à réduire l'empreinte de la mémoire dans les applications de longue durée.

Fondamentalement, utilisez des références faibles lorsque vous devez observer ou vous référer à un objet sans interférer avec son cycle de vie . Ils sont particulièrement utiles dans les boîtes à outils GUI, les systèmes d'événements, les caches et les structures de données de type arbre avec des références arrière.

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 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

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Stock Market GPT

Stock Market GPT

Recherche d'investissement basée sur l'IA pour des décisions plus intelligentes

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment utiliser des expressions régulières avec le module RE dans Python? Comment utiliser des expressions régulières avec le module RE dans Python? Aug 22, 2025 am 07:07 AM

Des expressions régulières sont implémentées dans Python via le module RE pour la recherche, la correspondance et la manipulation des chaînes. 1. Utilisez re.search () pour trouver la première correspondance de toute la chaîne, re.match () ne correspond qu'au début de la chaîne; 2. Utilisez des supports () pour capturer les sous-groupes correspondants, qui peuvent être nommés pour améliorer la lisibilité; 3. Re.findall () renvoie toutes les correspondances non chevauchantes, et re.finditer () renvoie l'itérateur de l'objet correspondant; 4. Re.sub () remplace le texte correspondant et prend en charge le remplacement de la fonction dynamique; 5. Les modèles communs incluent \ d, \ w, \ s, etc., vous pouvez utiliser re.ignorecase, re.multiline, re.dotall, re.

Comment déboguer une application Python distante dans VSCODE Comment déboguer une application Python distante dans VSCODE Aug 30, 2025 am 06:17 AM

Pour déboguer une application Python distante, vous devez utiliser Debugpy et configurer le transfert de port et le mappage de chemin: Tout d'abord, installez Debugpy sur la machine distante et modifiez le code pour écouter le port 5678, transférez le port distant vers la zone locale via le tunnel SSH, puis configurez correctement les mappages de chemins locaux et de remotoot. Enfin, démarrez l'application et connectez-vous au débogueur pour réaliser le débogage de points d'arrêt distant, la vérification des variables et le pas de code. L'ensemble du processus dépend de Debugpy, de la transfert de port sécurisée et de la correspondance précise du chemin.

Comment construire et exécuter Python dans un texte sublime? Comment construire et exécuter Python dans un texte sublime? Aug 22, 2025 pm 03:37 PM

EnsurePythonisinstalledbyrunningpython--versionorpython3--versionintheterminal;ifnotinstalled,downloadfrompython.organdaddtoPATH.2.InSublimeText,gotoTools>BuildSystem>NewBuildSystem,replacecontentwith{"cmd":["python","-

Comment exécuter Python dans la console de texte sublime? Comment exécuter Python dans la console de texte sublime? Aug 22, 2025 pm 03:55 PM

Pour exécuter les scripts Python, vous devez configurer le système de construction de SublimeText: 1. Assurez-vous que Python est installé et disponible sur la ligne de commande; 2. Créez un nouveau système de construction dans sublimeText, entrez {"cmd": ["python", "- u", "$ file"], "file_regex": "^ [] file \" (...?) \ ", Line ([0-9] *)", "Selector": & qu

Comment trouvez-vous les éléments communs entre deux ou plusieurs listes dans Python? Comment trouvez-vous les éléments communs entre deux ou plusieurs listes dans Python? Aug 27, 2025 am 05:27 AM

Le moyen le plus efficace de trouver des éléments communs de deux ou plusieurs listes consiste à utiliser le fonctionnement de l'intersection de l'ensemble. 1. Convertissez la liste en un ensemble et utilisez la méthode & Operator ou .Inthesection () pour trouver l'intersection, par exemple, Common = list (set (list1) & set (list2)); 2. Pour plusieurs listes, vous pouvez utiliser SET (list1) .Inthesection (set (list2), set (list3)) ou set.INTERSENET (* map (set, lists)) pour réaliser un traitement dynamique; 3. Faites attention à la déduplication désordonnée et automatique. Si vous devez maintenir l'ordre, vous pouvez traverser la liste originale et combiner le jugement défini.

Quelle est la différence entre une importation absolue et relative dans Python? Quelle est la différence entre une importation absolue et relative dans Python? Aug 29, 2025 am 05:25 AM

ABSOLUTEIMPORTSPECIFICATIONS THE AUTREPROSS

Quelle est l'utilisation de soi dans Python Quelle est l'utilisation de soi dans Python Aug 22, 2025 am 07:57 AM

Self-déception de la mise en forme de la classe

Comment implémenter le modèle de conception singleton dans Python Comment implémenter le modèle de conception singleton dans Python Sep 01, 2025 am 04:25 AM

L'utilisation des instances au niveau du module est la plus simple et la plus conforme aux habitudes Python. En définissant des instances de classe dans des modules, en utilisant la fonctionnalité du chargement du module Python une seule fois pour garantir l'unicité globale, comme la création d'un fichier config.py et la définition d'une instance de configuration. D'autres modules partagent le même objet lors de l'importation. Cette méthode est simple, lisible et en filetage, et convient à la plupart des scénarios pratiques. De plus, il peut également être mis en œuvre en réécrivant la méthode __New__, en utilisant des décorateurs, des métaclases, etc., où la méthode __New__ contrôle l'unicité de l'instance par le biais de variables de classe, mais prête attention aux problèmes de sécurité des fils. La méthode du décorateur peut être réutilisée entre les classes mais peut affecter la collecte des ordures. La méthode métaclasse prend en charge l'héritage et le contrôle centralisé mais la réplication.

See all articles