Table des matières
Évitez les objets mutables comme paramètres par défaut
Utilisation correcte des paramètres variables par défaut
Portée en Python
AttributsMasquer" >ClasseAttributsMasquer
tuple是“可变的”
Python的深浅拷贝
模块循环依赖
Maison développement back-end Tutoriel Python Explication détaillée des pièges et précautions Python couramment rencontrés en développement

Explication détaillée des pièges et précautions Python couramment rencontrés en développement

Mar 16, 2017 pm 05:05 PM
python

J'ai rencontré quelques pièges récemment lors de l'utilisation de Python, comme l'utilisation de datetime.datetime.now(), une variable objetEn tant que paramètre par défaut de la fonction , du module boucle dépendance, etc.

Enregistrez-le ici pour une future enquête et un supplément.

Évitez les objets mutables comme paramètres par défaut

Dans le processus d'utilisation des fonctions, les paramètres par défaut sont souvent impliqués. En Python, lors de l'utilisation d'objets mutables comme paramètres par défaut, des résultats inattendus peuvent survenir.

Regardez un exemple ci-dessous :

def append_item(a = 1, b = []):
    b.append(a)
    print b
    
append_item(a=1)
append_item(a=3)
append_item(a=5)
Copier après la connexion

Le résultat est :

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

Comme vous pouvez le voir sur le résultat, lorsque la fonction append_item est appelée deux fois plus tard , Paramètre de fonctionb n'est pas initialisé à [], mais conserve la valeur de l'appel de fonction précédent.

La raison pour laquelle ce résultat est obtenu est qu'en Python, la valeur par défaut d'un paramètre de fonction n'est initialisée qu'une seule fois lorsque la fonction est définie.

Regardons un exemple pour prouver cette fonctionnalité de Python :

class Test(object):  
    def init(self):  
        print("Init Test")  
          
def arg_init(a, b = Test()):  
    print(a)  
arg_init(1)  
arg_init(3)  
arg_init(5)
Copier après la connexion

Le résultat est :

Init Test
1
3
5
Copier après la connexion

Comme vous pouvez le voir à partir des résultats de cet exemple , la classe Test uniquement Elle est instanciée une fois, ce qui signifie que les paramètres par défaut n'ont rien à voir avec le nombre d'appels de fonction et ne sont initialisés qu'une seule fois lorsque la fonction est définie.

Utilisation correcte des paramètres variables par défaut

Pour les paramètres variables par défaut, nous pouvons utiliser le modèle suivant pour éviter les résultats inattendus ci-dessus :

def append_item(a = 1, b = None):
    if b is None:
        b = []
    b.append(a)
    print b
    
append_item(a=1)
append_item(a=3)
append_item(a=5)
Copier après la connexion

Le résultat est :

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

Portée en Python

L'ordre de résolution de la portée de Python est Local, Englobant, Global, Intégré, ce qui signifie que l'interpréteur Python analysera les variables .


Regardez un exemple simple :

global_var = 0
def outer_func():
    outer_var = 1
    
    def inner_func():
        inner_var = 2
        
        print "global_var is :", global_var
        print "outer_var is :", outer_var
        print "inner_var is :", inner_var
        
    inner_func()
    
outer_func()
Copier après la connexion

Le résultat est :

global_var is : 0
outer_var is : 1
inner_var is : 2
Copier après la connexion

En Python, il y a une chose Il convient de noter que lors de l'attribution d'une valeur à une variable dans une portée, Python considérera la variable comme une variable locale de la portée actuelle.


Ceci est également relativement facile à comprendre. Pour le code suivant, var_func attribue une valeur à la variable num, donc num est ici une variable locale dans la portée var_func.

num = 0
def var_func():
    num = 1
    print "num is :", num
    
var_func()
Copier après la connexion

Problème 1

Cependant, lorsque nous utilisons les variables de la manière suivante, des problèmes surgiront :

num = 0
def var_func():
    print "num is :", num
    num = 1
    
var_func()
Copier après la connexion

Les résultats sont les suivants :

UnboundLocalError: local variable 'num' referenced before assignment
Copier après la connexion

La raison pour laquelle cette erreur se produit est que nous avons attribué une valeur à la variable num dans var_func, donc l'interpréteur Python pensera que num est une variable locale dans la portée var_func, mais lorsque le code est exécuté pour imprimer "num is :", num n'est toujours pas défini lors de l'exécution de l'instruction num.


Question 2

L'erreur ci-dessus est relativement évidente, et il existe également une forme d'erreur plus subtile comme suit :

li = [1, 2, 3]
def foo():
    li.append(4)
    print li
foo()
def bar():
    li +=[5]
    print li
bar()
Copier après la connexion

Le résultat du code est :

[1, 2, 3, 4]
UnboundLocalError: local variable 'li' referenced before assignment
Copier après la connexion

Dans la fonction foo, selon l'ordre d'analyse de la portée de Python, la variable globale li est utilisée dans cette fonction mais dans la fonction bar, la variable li est affectée ; une valeur, donc li sera traité comme une variable dans le cadre de bar.


Pour ce problème de la fonction barre, vous pouvez utiliser le mot clé global.

li = [1, 2, 3]
def foo():
    li.append(4)
    print li
    
foo()
def bar():
    global li
    li +=[5]
    print li
    
bar()
Copier après la connexion

ClasseAttributsMasquer

En Python, il existe des attributs de classe et des attributs d'instance. Les attributs de classe appartiennent à la classe elle-même et sont partagés par toutes les instances de classe.

Les attributs de classe sont accessibles et modifiés via le nom de la classe, et peuvent également être consultés et modifiés via l'instance de classe. Cependant, lorsqu'une instance définit un attribut portant le même nom que la classe, l'attribut de classe est masqué.


Regardez l'exemple suivant :

class Student(object):
    books = ["Python", "JavaScript", "CSS"]
    def init(self, name, age):
        self.name = name
        self.age = age
    pass
    
wilber = Student("Wilber", 27)
print "%s is %d years old" %(wilber.name, wilber.age)
print Student.books
print wilber.books
wilber.books = ["HTML", "AngularJS"]
print Student.books
print wilber.books
del wilber.books
print Student.books
print wilber.books
Copier après la connexion

Le résultat du code est le suivant Dans un premier temps, l'instance wilber peut directement. accéder à l'attribut books de la classe, mais lorsque Après que l'instance wilber ait défini un attribut d'instance nommé books, l'attribut books de l'instance wilber "masque" l'attribut books de la classe lorsque supprime l'attribut books de ; l'instance de Wilber, wilber.books correspond à l'attribut class Again books.

Wilber is 27 years old
['Python', 'JavaScript', 'CSS']
['Python', 'JavaScript', 'CSS']
['Python', 'JavaScript', 'CSS']
['HTML', 'AngularJS']
['Python', 'JavaScript', 'CSS']
['Python', 'JavaScript', 'CSS']
Copier après la connexion

Lorsque vous utilisez l' héritage dans les valeurs Python, vous devez également faire attention au masquage des attributs de classe. Pour une classe, vous pouvez afficher tous les attributs de classe via l'attribut dict de la classe.


Lors de l'accès à un attribut de classe via le nom de la classe, il recherchera d'abord l'attribut dict de la classe. Si l'attribut de classe n'est pas trouvé, il continuera la recherche. pour la classe parent. Cependant, si la sous-classe définit un attribut de classe portant le même nom que la classe parent, les attributs de classe de la sous-classe masqueront les attributs de classe de la classe parent.


Regardez un exemple :

class A(object):
    count = 1
    
class B(A):
    pass    
    
class C(A):
    pass        
    
print A.count, B.count, C.count      
B.count = 2
print A.count, B.count, C.count      
A.count = 3
print A.count, B.count, C.count     
print B.dict
print C.dict
Copier après la connexion

Les résultats sont les suivants Lorsque la classe B définit l'attribut count, l'attribut count de la classe parent. sera masqué :

1 1 1
1 2 1
3 2 3
{'count': 2, 'module': 'main', 'doc': None}
{'module': 'main', 'doc': None}
Copier après la connexion

tuple是“可变的”

在Python中,tuple是不可变对象,但是这里的不可变指的是tuple这个容器总的元素不可变(确切的说是元素的id),但是元素的值是可以改变的。

tpl = (1, 2, 3, [4, 5, 6])
print id(tpl)
print id(tpl[3])
tpl[3].extend([7, 8])
print tpl
print id(tpl)
print id(tpl[3])
Copier après la connexion

代码结果如下,对于tpl对象,它的每个元素都是不可变的,但是tpl[3]是一个list对象。也就是说,对于这个tpl对象,id(tpl[3])是不可变的,但是tpl[3]确是可变的。

36764576
38639896
(1, 2, 3, [4, 5, 6, 7, 8])
36764576
38639896
Copier après la connexion

Python的深浅拷贝

在对Python对象进行赋值的操作中,一定要注意对象的深浅拷贝,一不小心就可能踩坑了。


当使用下面的操作的时候,会产生浅拷贝的效果:


使用切片[:]操作

使用工厂函数(如list/dir/set

使用copy模块中的copy()函数

使用copy模块里面的浅拷贝函数copy():

import copy
will = ["Will", 28, ["Python", "C#", "JavaScript"]]
wilber = copy.copy(will)
print id(will)
print will
print [id(ele) for ele in will]
print id(wilber)
print wilber
print [id(ele) for ele in wilber]
will[0] = "Wilber"
will[2].append("CSS")
print id(will)
print will
print [id(ele) for ele in will]
print id(wilber)
print wilber
print [id(ele) for ele in wilber]
Copier après la connexion

使用copy模块里面的深拷贝函数deepcopy():

import copy
will = ["Will", 28, ["Python", "C#", "JavaScript"]]
wilber = copy.deepcopy(will)
print id(will)
print will
print [id(ele) for ele in will]
print id(wilber)
print wilber
print [id(ele) for ele in wilber]
will[0] = "Wilber"
will[2].append("CSS")
print id(will)
print will
print [id(ele) for ele in will]
print id(wilber)
print wilber
print [id(ele) for ele in wilber]
Copier après la connexion

模块循环依赖

在Python中使用import导入模块的时候,有的时候会产生模块循环依赖,例如下面的例子,module_x模块和module_y模块相互依赖,运行module_y.py的时候就会产生错误。

# module_x.py
import module_y
    
def inc_count():
    module_y.count += 1
    print module_y.count
    
    
# module_y.py
import module_x
count = 10
def run():
    module_x.inc_count()
    
run()
Copier après la connexion


其实,在编码的过程中就应当避免循环依赖的情况,或者代码重构的过程中消除循环依赖。

当然,上面的问题也是可以解决的,常用的解决办法就是把引用关系搞清楚,让某个模块在真正需要的时候再导入(一般放到函数里面)。

对于上面的例子,就可以把module_x.py修改为如下形式,在函数内部导入module_y:

# module_x.py
def inc_count():
    import module_y
    module_y.count += 1
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!

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)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
3 Il y a quelques semaines 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)

Comment les plumes PS contrôlent-elles la douceur de la transition? Comment les plumes PS contrôlent-elles la douceur de la transition? Apr 06, 2025 pm 07:33 PM

La clé du contrôle des plumes est de comprendre sa nature progressive. Le PS lui-même ne fournit pas la possibilité de contrôler directement la courbe de gradient, mais vous pouvez ajuster de manière flexible le rayon et la douceur du gradient par plusieurs plumes, des masques correspondants et des sélections fines pour obtenir un effet de transition naturel.

MySQL doit-il payer MySQL doit-il payer Apr 08, 2025 pm 05:36 PM

MySQL a une version communautaire gratuite et une version d'entreprise payante. La version communautaire peut être utilisée et modifiée gratuitement, mais le support est limité et convient aux applications avec des exigences de stabilité faibles et des capacités techniques solides. L'Enterprise Edition fournit une prise en charge commerciale complète pour les applications qui nécessitent une base de données stable, fiable et haute performance et disposées à payer pour le soutien. Les facteurs pris en compte lors du choix d'une version comprennent la criticité des applications, la budgétisation et les compétences techniques. Il n'y a pas d'option parfaite, seulement l'option la plus appropriée, et vous devez choisir soigneusement en fonction de la situation spécifique.

Comment utiliser MySQL après l'installation Comment utiliser MySQL après l'installation Apr 08, 2025 am 11:48 AM

L'article présente le fonctionnement de la base de données MySQL. Tout d'abord, vous devez installer un client MySQL, tel que MySQLWorkBench ou le client de ligne de commande. 1. Utilisez la commande MySQL-UROot-P pour vous connecter au serveur et connecter avec le mot de passe du compte racine; 2. Utilisez Createdatabase pour créer une base de données et utilisez Sélectionner une base de données; 3. Utilisez CreateTable pour créer une table, définissez des champs et des types de données; 4. Utilisez InsertInto pour insérer des données, remettre en question les données, mettre à jour les données par mise à jour et supprimer les données par Supprimer. Ce n'est qu'en maîtrisant ces étapes, en apprenant à faire face à des problèmes courants et à l'optimisation des performances de la base de données que vous pouvez utiliser efficacement MySQL.

Comment configurer des plumes de PS? Comment configurer des plumes de PS? Apr 06, 2025 pm 07:36 PM

La plume PS est un effet flou du bord de l'image, qui est réalisé par la moyenne pondérée des pixels dans la zone de bord. Le réglage du rayon de la plume peut contrôler le degré de flou, et plus la valeur est grande, plus elle est floue. Le réglage flexible du rayon peut optimiser l'effet en fonction des images et des besoins. Par exemple, l'utilisation d'un rayon plus petit pour maintenir les détails lors du traitement des photos des caractères et l'utilisation d'un rayon plus grand pour créer une sensation brumeuse lorsque le traitement de l'art fonctionne. Cependant, il convient de noter que trop grand, le rayon peut facilement perdre des détails de bord, et trop petit, l'effet ne sera pas évident. L'effet de plumes est affecté par la résolution de l'image et doit être ajusté en fonction de la compréhension de l'image et de la saisie de l'effet.

MySQL ne peut pas être installé après le téléchargement MySQL ne peut pas être installé après le téléchargement Apr 08, 2025 am 11:24 AM

Les principales raisons de la défaillance de l'installation de MySQL sont les suivantes: 1. Problèmes d'autorisation, vous devez s'exécuter en tant qu'administrateur ou utiliser la commande sudo; 2. Des dépendances sont manquantes et vous devez installer des packages de développement pertinents; 3. Conflits du port, vous devez fermer le programme qui occupe le port 3306 ou modifier le fichier de configuration; 4. Le package d'installation est corrompu, vous devez télécharger et vérifier l'intégrité; 5. La variable d'environnement est mal configurée et les variables d'environnement doivent être correctement configurées en fonction du système d'exploitation. Résolvez ces problèmes et vérifiez soigneusement chaque étape pour installer avec succès MySQL.

Comment optimiser les performances de la base de données après l'installation de MySQL Comment optimiser les performances de la base de données après l'installation de MySQL Apr 08, 2025 am 11:36 AM

L'optimisation des performances MySQL doit commencer à partir de trois aspects: configuration d'installation, indexation et optimisation des requêtes, surveillance et réglage. 1. Après l'installation, vous devez ajuster le fichier my.cnf en fonction de la configuration du serveur, tel que le paramètre innodb_buffer_pool_size, et fermer query_cache_size; 2. Créez un index approprié pour éviter les index excessifs et optimiser les instructions de requête, telles que l'utilisation de la commande Explication pour analyser le plan d'exécution; 3. Utilisez le propre outil de surveillance de MySQL (ShowProcessList, Showstatus) pour surveiller la santé de la base de données, et sauvegarde régulièrement et organisez la base de données. Ce n'est qu'en optimisant en continu ces étapes que les performances de la base de données MySQL peuvent être améliorées.

Le fichier de téléchargement MySQL est endommagé et ne peut pas être installé. Réparer la solution Le fichier de téléchargement MySQL est endommagé et ne peut pas être installé. Réparer la solution Apr 08, 2025 am 11:21 AM

Le fichier de téléchargement mysql est corrompu, que dois-je faire? Hélas, si vous téléchargez MySQL, vous pouvez rencontrer la corruption des fichiers. Ce n'est vraiment pas facile ces jours-ci! Cet article expliquera comment résoudre ce problème afin que tout le monde puisse éviter les détours. Après l'avoir lu, vous pouvez non seulement réparer le package d'installation MySQL endommagé, mais aussi avoir une compréhension plus approfondie du processus de téléchargement et d'installation pour éviter de rester coincé à l'avenir. Parlons d'abord de la raison pour laquelle le téléchargement des fichiers est endommagé. Il y a de nombreuses raisons à cela. Les problèmes de réseau sont le coupable. L'interruption du processus de téléchargement et l'instabilité du réseau peut conduire à la corruption des fichiers. Il y a aussi le problème avec la source de téléchargement elle-même. Le fichier serveur lui-même est cassé, et bien sûr, il est également cassé si vous le téléchargez. De plus, la numérisation excessive "passionnée" de certains logiciels antivirus peut également entraîner une corruption des fichiers. Problème de diagnostic: déterminer si le fichier est vraiment corrompu

Comment optimiser les performances MySQL pour les applications de haute charge? Comment optimiser les performances MySQL pour les applications de haute charge? Apr 08, 2025 pm 06:03 PM

Guide d'optimisation des performances de la base de données MySQL dans les applications à forte intensité de ressources, la base de données MySQL joue un rôle crucial et est responsable de la gestion des transactions massives. Cependant, à mesure que l'échelle de l'application se développe, les goulots d'étranglement des performances de la base de données deviennent souvent une contrainte. Cet article explorera une série de stratégies efficaces d'optimisation des performances MySQL pour garantir que votre application reste efficace et réactive dans des charges élevées. Nous combinerons des cas réels pour expliquer les technologies clés approfondies telles que l'indexation, l'optimisation des requêtes, la conception de la base de données et la mise en cache. 1. La conception de l'architecture de la base de données et l'architecture optimisée de la base de données sont la pierre angulaire de l'optimisation des performances MySQL. Voici quelques principes de base: sélectionner le bon type de données et sélectionner le plus petit type de données qui répond aux besoins peut non seulement économiser un espace de stockage, mais également améliorer la vitesse de traitement des données.

See all articles