Table des matières
1. Les types de données variables sont utilisés comme paramètres par défaut dans les définitions de fonctions
2. Types de données mutables en tant que variables de classe
3. Erreur d'allocation de variable
Maison développement back-end Tutoriel Python Introduction aux erreurs courantes lors de l'utilisation des variables Python

Introduction aux erreurs courantes lors de l'utilisation des variables Python

Sep 19, 2017 am 09:45 AM
python 介绍

Nous rencontrons souvent des erreurs inexplicables dans la programmation Python. En fait, ce n'est pas un problème avec le langage lui-même, mais dû au fait que nous ignorons certaines caractéristiques du langage lui-même. Aujourd'hui, nous allons examiner 3 erreurs incroyables causées par. en utilisant des variables Python, veuillez prêter plus d'attention lors de la programmation future.

1. Les types de données variables sont utilisés comme paramètres par défaut dans les définitions de fonctions

Cela semble correct ? Vous écrivez une petite fonction qui, par exemple, recherche un lien sur la page actuelle et l'ajoute éventuellement à une autre liste fournie.

def search_for_links(page, add_to=[]):
    new_links = page.search_for_links()
    add_to.extend(new_links)
    return add_to
Copier après la connexion

En apparence, cela ressemble à du code Python parfaitement normal, et en fait c'est le cas, et il peut s'exécuter. Cependant, il y a un problème. Si nous fournissons une liste au paramètre add_to, cela fonctionnera comme prévu. Mais si nous le laissons utiliser la valeur par défaut, quelque chose de magique se produit.

Essayez le code suivant :

def fn(var1, var2=[]):
    var2.append(var1)
    print(var2)
fn(3)
fn(4)
fn(5)
Copier après la connexion

Peut-être pensez-vous que nous verrons :

[3]
[4]
[5]
Copier après la connexion

Mais en réalité, ce que nous voyons est :

[3]
[3,4]
[3,4,5]
Copier après la connexion

Pourquoi ? Comme vous pouvez le voir, la même liste est utilisée à chaque fois. Pourquoi le résultat est-il ainsi ? En Python, lorsque nous écrivons une telle fonction, cette liste est instanciée dans le cadre de la définition de la fonction. Lorsqu'une fonction s'exécute, elle n'est pas instanciée à chaque fois. Cela signifie que cette fonction utilisera toujours exactement le même objet de liste à moins que nous fournissions un nouvel objet :

fn(3,[4])
[4,3]
Copier après la connexion

La réponse est exactement ce que nous pensions. Pour obtenir ce résultat, la bonne manière est :

def fn(var1, var2=None):
    ifnot var2:
        var2 =[]
    var2.append(var1)
Copier après la connexion

ou dans le premier exemple :

def search_for_links(page, add_to=None):
    ifnot add_to:
        add_to =[]
    new_links = page.search_for_links()
    add_to.extend(new_links)
    return add_to
Copier après la connexion

Cela supprimera l'instanciation lorsque le module chargera du contenu afin que l'instanciation de la liste se produise chaque fois que la fonction est exécutée. Veuillez noter que pour les types de données immuables, tels que les tuples, les chaînes et les entiers, cette situation n'a pas besoin d'être prise en compte. Cela signifie qu'un code comme celui-ci est tout à fait réalisable :

def func(message="my message"):
    print(message)
Copier après la connexion

2. Types de données mutables en tant que variables de classe

Ceci est très similaire à la dernière erreur mentionnée ci-dessus. Considérez le code suivant :

class URLCatcher(object):
    urls =[]
    def add_url(self, url):
        self.urls.append(url)
Copier après la connexion

Ce code semble parfaitement normal. Nous avons un objet qui stocke les URL. Lorsque nous appelons la méthode add_url, elle ajoute une URL donnée au stockage. Ça a l'air plutôt bien, non ? Voyons à quoi ça ressemble réellement :

a =URLCatcher()
a.add_url('http://www.google.com')
b =URLCatcher()
b.add_url('http://www.pythontab.com')
print(b.urls)
print(a.urls)
Copier après la connexion

Résultat :

['http://www.google.com','http://www.pythontab.com']
['http://www.google.com','http://www.pythontab.com']
Copier après la connexion

Attendez, que se passe-t-il ? ! Ce n'est pas ce que nous pensions. Nous instancions deux objets distincts a et b. Donnez une URL à a et une autre à b. Comment se fait-il que ces deux objets aient ces deux URL ?

C'est le même problème que le premier exemple d'erreur. Lorsque la définition de classe est créée, la liste d'URL est instanciée. Toutes les instances de cette classe utilisent la même liste. Il y a des moments où cela est utile, mais la plupart du temps, vous ne voulez pas le faire. Vous souhaitez un stockage séparé pour chaque objet. Pour ce faire, nous modifions le code en :

class URLCatcher(object):
    def __init__(self):
        self.urls =[]
    def add_url(self, url):
        self.urls.append(url)
Copier après la connexion

Maintenant, lorsque l'objet est créé, la liste d'URL est instanciée. Lorsque nous instancions deux objets distincts, ils utiliseront chacun deux listes distinctes.

3. Erreur d'allocation de variable

Ce problème me dérange depuis un moment. Apportons quelques modifications et utilisons un autre type de données mutable : un dictionnaire.

a ={'1':"one",'2':'two'}
Copier après la connexion

Maintenant, supposons que nous souhaitions utiliser ce dictionnaire ailleurs tout en gardant intactes ses données d'origine.

b = a
b['3']='three'
Copier après la connexion

Facile, non ?

Maintenant, regardons le dictionnaire original a que nous ne voulons pas changer :

{'1':"one",'2':'two','3':'three'}
Copier après la connexion
Copier après la connexion

Wow, attendez, regardons à nouveau b ?

{'1':"one",'2':'two','3':'three'}
Copier après la connexion
Copier après la connexion

Attends, quoi ? Un peu brouillon... Revenons en arrière et voyons ce qui se passe dans ce cas avec d'autres types immuables, comme un tuple :

c =(2,3)
d = c
d =(4,5)
Copier après la connexion

Maintenant c est (2, 3) et d est (4, 5 ).

Le résultat de cette fonction est comme nous l'espérions. Alors, que s’est-il passé exactement dans l’exemple précédent ? Lorsque vous utilisez un type mutable, il se comporte un peu comme un pointeur en C. Dans le code ci-dessus, nous laissons b = a, ce que nous voulons vraiment dire est : b devient une référence de a. Ils pointent tous vers le même objet dans la mémoire Python. Cela vous semble familier ? C'est parce que cette question est similaire à la précédente.

Est-ce que la même chose se produira avec les listes ? Oui. Alors, comment pouvons-nous le résoudre ? Cela doit être fait avec beaucoup de soin. Si nous avons vraiment besoin de copier une liste pour le traitement, nous pouvons le faire :

b = a[:]
Copier après la connexion

Cela parcourra et copiera la référence de chaque objet de la liste et le placera dans une nouvelle liste. Mais attention : si tous les objets de la liste sont mutables, nous obtiendrons à nouveau une référence à eux, pas une copie complète.

Supposons que vous fassiez une liste sur un morceau de papier. Dans l’exemple original, cela équivaut à ce que A et B regardent le même morceau de papier. Si une personne modifie cette fiche, les deux personnes verront les mêmes changements. Lorsque l’on copie les références, chacun a désormais sa propre liste. Cependant, nous supposons que cette liste comprend des endroits où trouver de la nourriture. Si « réfrigérateur » est en premier dans la liste, même s'il est copié, les entrées des deux listes pointeront vers le même réfrigérateur. Par conséquent, si le réfrigérateur est modifié par A et mange le gros gâteau à l’intérieur, B verra également la disparition du gâteau. Il n’y a pas de solution simple ici. Souvenez-vous-en et écrivez votre code de manière à ne pas poser ce problème.

字典以相同的方式工作,并且你可以通过以下方式创建一个昂贵副本:

b = a.copy()
Copier après la connexion

再次说明,这只会创建一个新的字典,指向原来存在的相同的条目。因此,如果我们有两个相同的列表,并且我们修改字典 a 的一个键指向的可变对象,那么在字典 b 中也将看到这些变化。

可变数据类型的麻烦也是它们强大的地方。以上都不是实际中的问题;它们是一些要注意防止出现的问题。在第三个项目中使用昂贵复制操作作为解决方案在 99% 的时候是没有必要的。

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

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.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. Vous avez un jeu croisé?
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

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)

PHP et Python: exemples de code et comparaison PHP et Python: exemples de code et comparaison Apr 15, 2025 am 12:07 AM

PHP et Python ont leurs propres avantages et inconvénients, et le choix dépend des besoins du projet et des préférences personnelles. 1.Php convient au développement rapide et à la maintenance des applications Web à grande échelle. 2. Python domine le domaine de la science des données et de l'apprentissage automatique.

Python vs JavaScript: communauté, bibliothèques et ressources Python vs JavaScript: communauté, bibliothèques et ressources Apr 15, 2025 am 12:16 AM

Python et JavaScript ont leurs propres avantages et inconvénients en termes de communauté, de bibliothèques et de ressources. 1) La communauté Python est amicale et adaptée aux débutants, mais les ressources de développement frontal ne sont pas aussi riches que JavaScript. 2) Python est puissant dans les bibliothèques de science des données et d'apprentissage automatique, tandis que JavaScript est meilleur dans les bibliothèques et les cadres de développement frontaux. 3) Les deux ont des ressources d'apprentissage riches, mais Python convient pour commencer par des documents officiels, tandis que JavaScript est meilleur avec MDNWEBDOCS. Le choix doit être basé sur les besoins du projet et les intérêts personnels.

Comment est la prise en charge du GPU pour Pytorch sur Centos Comment est la prise en charge du GPU pour Pytorch sur Centos Apr 14, 2025 pm 06:48 PM

Activer l'accélération du GPU Pytorch sur le système CentOS nécessite l'installation de versions CUDA, CUDNN et GPU de Pytorch. Les étapes suivantes vous guideront tout au long du processus: CUDA et CUDNN Installation détermineront la compatibilité de la version CUDA: utilisez la commande NVIDIA-SMI pour afficher la version CUDA prise en charge par votre carte graphique NVIDIA. Par exemple, votre carte graphique MX450 peut prendre en charge CUDA11.1 ou plus. Téléchargez et installez Cudatoolkit: visitez le site officiel de Nvidiacudatoolkit et téléchargez et installez la version correspondante selon la version CUDA la plus élevée prise en charge par votre carte graphique. Installez la bibliothèque CUDNN:

Explication détaillée du principe docker Explication détaillée du principe docker Apr 14, 2025 pm 11:57 PM

Docker utilise les fonctionnalités du noyau Linux pour fournir un environnement de fonctionnement d'application efficace et isolé. Son principe de travail est le suivant: 1. Le miroir est utilisé comme modèle en lecture seule, qui contient tout ce dont vous avez besoin pour exécuter l'application; 2. Le Système de fichiers Union (UnionFS) empile plusieurs systèmes de fichiers, ne stockant que les différences, l'économie d'espace et l'accélération; 3. Le démon gère les miroirs et les conteneurs, et le client les utilise pour l'interaction; 4. Les espaces de noms et les CGROUP implémentent l'isolement des conteneurs et les limitations de ressources; 5. Modes de réseau multiples prennent en charge l'interconnexion du conteneur. Ce n'est qu'en comprenant ces concepts principaux que vous pouvez mieux utiliser Docker.

Miniopen Centos Compatibilité Miniopen Centos Compatibilité Apr 14, 2025 pm 05:45 PM

Minio Object Storage: Déploiement haute performance dans le système Centos System Minio est un système de stockage d'objets distribué haute performance développé sur la base du langage Go, compatible avec Amazons3. Il prend en charge une variété de langages clients, notamment Java, Python, JavaScript et GO. Cet article introduira brièvement l'installation et la compatibilité de Minio sur les systèmes CentOS. Compatibilité de la version CentOS Minio a été vérifiée sur plusieurs versions CentOS, y compris, mais sans s'y limiter: CentOS7.9: fournit un guide d'installation complet couvrant la configuration du cluster, la préparation de l'environnement, les paramètres de fichiers de configuration, le partitionnement du disque et la mini

Comment faire fonctionner la formation distribuée de Pytorch sur CentOS Comment faire fonctionner la formation distribuée de Pytorch sur CentOS Apr 14, 2025 pm 06:36 PM

La formation distribuée par Pytorch sur le système CentOS nécessite les étapes suivantes: Installation de Pytorch: La prémisse est que Python et PIP sont installés dans le système CentOS. Selon votre version CUDA, obtenez la commande d'installation appropriée sur le site officiel de Pytorch. Pour la formation du processeur uniquement, vous pouvez utiliser la commande suivante: pipinstalltorchtorchVisionTorChaudio Si vous avez besoin d'une prise en charge du GPU, assurez-vous que la version correspondante de CUDA et CUDNN est installée et utilise la version Pytorch correspondante pour l'installation. Configuration de l'environnement distribué: la formation distribuée nécessite généralement plusieurs machines ou des GPU multiples uniques. Lieu

Comment choisir la version Pytorch sur Centos Comment choisir la version Pytorch sur Centos Apr 14, 2025 pm 06:51 PM

Lors de l'installation de Pytorch sur le système CentOS, vous devez sélectionner soigneusement la version appropriée et considérer les facteurs clés suivants: 1. Compatibilité de l'environnement du système: Système d'exploitation: Il est recommandé d'utiliser CentOS7 ou plus. CUDA et CUDNN: La version Pytorch et la version CUDA sont étroitement liées. Par exemple, Pytorch1.9.0 nécessite CUDA11.1, tandis que Pytorch2.0.1 nécessite CUDA11.3. La version CUDNN doit également correspondre à la version CUDA. Avant de sélectionner la version Pytorch, assurez-vous de confirmer que des versions compatibles CUDA et CUDNN ont été installées. Version Python: branche officielle de Pytorch

Python: automatisation, script et gestion des tâches Python: automatisation, script et gestion des tâches Apr 16, 2025 am 12:14 AM

Python excelle dans l'automatisation, les scripts et la gestion des tâches. 1) Automatisation: La sauvegarde du fichier est réalisée via des bibliothèques standard telles que le système d'exploitation et la fermeture. 2) Écriture de script: utilisez la bibliothèque PSUTIL pour surveiller les ressources système. 3) Gestion des tâches: utilisez la bibliothèque de planification pour planifier les tâches. La facilité d'utilisation de Python et la prise en charge de la bibliothèque riche en font l'outil préféré dans ces domaines.

See all articles