si vs si A n'est pas Rien:
Puis-je utiliser:
if A:
au lieu de
if A is not None:
Ce dernier semble donc clair. Est-il une différence?
Vous devez vous connecter pour publier un commentaire.
Puis-je utiliser:
if A:
au lieu de
if A is not None:
Ce dernier semble donc clair. Est-il une différence?
Vous devez vous connecter pour publier un commentaire.
La déclaration
appellera
A.__nonzero__()
(voir Spécial noms de méthode de la documentation) et utiliser la valeur de retour de cette fonction. Voici le résumé:D'autre part,
compare seulement la référence
A
avecNone
pour voir si elle est la même ou pas.A is not None
est plus rapide car il y a beaucoup moins de travail à faireif object(): pass
est ~0.130 usec par la boucle, tandis queif object() is not None: pass
est ~0.135 usec. De toute façon, vous ne devez pas utiliser les performances de choisir entre ces deux-là, mais plutôt regarder les différences dans la façon dont ils fonctionnent, car ils sont ce n'est pas l'équivalent.None
comme une étape intermédiaire pour comparer avecA
(jetez un oeil à ladis.dis()
). Corrigez-moi si je me trompe, maisif A:
semble être plus efficace, dès que vous vous en veut vraiment tester la valeur de vérité et de ne pas leNone
identité.python -m timeit -s"a=0" "if a: pass" "else: pass"
est plus rapide quepython -m timeit -s"a=0" "if a is None: pass" "else: pass"
maispython -m timeit -s"a=1" "if a: pass" "else: pass"
est plus lent. Peut-être la plateforme de charge, voir si vous obtenez les mêmes résultatsis None
test était en effet le plus lent pour moi. Dans pypy ils sont tous mesurés exactement la même chose 🙂A is not None
...None
doit être chargé et comparée...if A
:LOAD_FAST
(A
) +POP_JUMP_IF_FALSE
, alors queif A is not None
:LOAD_FAST
(A
) +LOAD_CONST
(None
) +COMPARE_OP
(is not
) +POP_JUMP_IF_FALSE
Comme écrit dans PEP8:
None
, mais juste valeur de vérité de la vérification. Dans ce cas,if A:
semble plus efficace (prendre undis.dis()
, il y a des étapes supplémentaires de chargement de la builtinNone
et en les comparant, avecif A is not None:
, alors qu'il est seulement unjump_if
dans les autres cas).donc c'est pas le même que
Beaucoup de retour des fonctions Aucune si il n'y a pas des résultats pertinents. Par exemple, un SQLAlchemy requête
.first()
méthode renvoie None s'il n'y avait pas de lignes dans le résultat. Supposons que vous soyez en sélectionnant une valeur qui peut retourner la valeur 0, et ont besoin de savoir si c'est en fait 0 ou si la requête a pas de résultats à tous.Un idiome commun est de donner une fonction ou une méthode de l'argument facultatif, la valeur par défaut, Aucun, et puis pour tester la valeur None pour voir si elle a été spécifiée. Par exemple:
comparer:
Dans ce dernier, ce qui se passe si vous appelez
spam(0)
ouspam([])
? La fonction (à tort) de détecter que vous n'aviez pas passé à une valeur deeggs
et calcule une valeur par défaut pour vous. Ce n'est probablement pas ce que vous voulez.Ou d'imaginer une méthode comme "retour à la liste des transactions pour un compte donné". Si le compte n'existe pas, il pourrait retourner Aucun. C'est différent que de retourner une liste vide (ce qui voudrait dire "ce compte existe mais n'a pas enregistré des transactions).
Enfin, de retour à la base de données des trucs. Il y a une grosse différence entre la valeur NULL et une chaîne vide. Une chaîne vide est généralement dit "il y a une valeur, et cette valeur n'est rien du tout". NULL dit "cette valeur n'a pas été saisi."
Dans chacun de ces cas, vous voulez les utiliser
if A is None
. Vous êtes à la recherche d'une valeur spécifique - Aucun - pas seulement "quelque valeur que ce qui arrive à lancer pour de Faux".Ils faire des choses très différentes.
Le ci-dessous vérifie si a a rien, sauf les valeurs
False
,[]
,None
,''
et0
. Il vérifie la valeur de A.Le ci-dessous vérifie si A est un objet différent de "None". Il vérifie et compare les référence (adresse mémoire) de l'Un et Aucun.
Mise à JOUR: de Plus amples explications
De nombreuses fois les deux semblent faire la même chose, de sorte que beaucoup de gens les utilisent de façon interchangeable - c'est une très mauvaise idée. La raison, les deux donnent le même résultat est de nombreuses fois par pure coïncidence grâce à l'optimisation de l'interpréteur/compilateur comme stage ou quelque chose d'autre.
Avec ces optimisations dans l'esprit, des entiers et des chaînes de la même valeur jusqu'en utilisant le même espace mémoire. Ce qui explique probablement pourquoi les deux chaînes distinctes agissent comme s'ils sont les mêmes.
D'autres choses ne se comportent pas de la même..
Les deux listes ont clairement leur propre mémoire. Étonnamment tuples de se comporter comme des chaînes de caractères.
C'est probablement parce que les tuples sont garantis de ne pas changer, donc il est logique de réutiliser la même mémoire.
Ligne de fond est que vous ne pouvez pas compter sur les coïncidences. Juste parce qu'il charlatans comme un canard, ça veut pas dire que c'est un canard. Utilisation
is
et==
selon ce que vous voulez vérifier. Ces choses peuvent être difficiles à déboguer depuisis
se lit comme de la prose que nous avons souvent écrémer sur elle.None
est un singleton, c'est pas un détail de l'implémentation (à la différence des int ou string en stage). Je ne suis pas sûr de suivre ce que tu veux dire.None
se comporte différemment queint
oustr
en raison d'un stage. Mon point est queis
et==
de la vérification de choses différentes; vérifie d'abord une adresse de mémoire, la deuxième vérifie le contenu de la mémoire d'adresses.si Un: se révélera faux si A est 0, False, ou Aucun, ce qui peut conduire à des résultats indésirables.
La plupart des guides que j'ai vu suggèrent que vous devriez utiliser
si Un:
à moins d'avoir une raison d'être plus précis.
Il y a quelques légères différences. Il y a d'autres valeurs que rien que le retour de Faux, par exemple vide de listes ou de 0, alors pensez à ce que c'est que vous êtes vraiment à tester.
Aucun n'est une valeur spéciale en Python qui désigne habituellement une variable non initialisée. Pour tester si Un n'a pas cette valeur particulière que vous utilisez:
Falsey les valeurs sont une classe particulière d'objets en Python (par exemple, un faux, []). Pour tester si Un est falsey utilisation:
Ainsi, les deux expressions ne sont pas les mêmes Et vous feriez mieux de ne pas les traiter comme des synonymes.
P. S. Aucun n'est aussi falsey, de sorte que la première expression implique la seconde. Mais la seconde s'étend à d'autres falsey valeurs d'ailleurs Aucun. Maintenant... si vous pouvez être sûr que vous ne pouvez pas avoir d'autres falsey valeurs d'ailleurs pas, vous pouvez remplacer la première expression avec la seconde.
Ça dépend du contexte.
- Je utiliser
if A:
lorsque je m'attends àA
à être une sorte de collection, et je ne veux exécuter le bloc, si la collection n'est pas vide. Cela permet à l'appelant de passer un bon comportement de collection, vide ou non, et de faire ce que j'attends. Il permet égalementNone
etFalse
pour réprimer l'exécution du bloc, qui est parfois commode de code d'appel.Otoh, que, si je m'attends à
A
à certains complètement arbitraire objet, mais il aurait pu être, par défaut,None
, alors je toujours utilisationif A is not None
, comme le code d'appel pourrait avoir délibérément adopté une référence à un regroupement vide, une chaîne vide, ou un 0 valeur de type numérique, booléen ouFalse
, ou certains instance de la classe qui se trouve être faux dans le contexte booléen.Et sur l'autre d'autre part, si je m'attends à
A
à être un peu plus spécifique de la chose (par exemple, instance d'une classe, je vais appeler des méthodes d'), mais il aurait pu être, par défaut,None
, et je considère booléen par défaut de conversion d'être une propriété de la classe je n'ai pas l'esprit de l'application sur toutes les sous-classes, alors je vais juste utiliserif A:
pour enregistrer mes doigts le terrible fardeau de taper un supplément de 12 caractères.Le premier est plus Pythonic (mieux ideomatic code), mais ne va pas exécuter le bloc si A est Fausse (non Nul).
is/is not None
. Suivant PEP8 est Pythonic. Outre les deux tests sont différentes.J'ai créé un fichier appelé
test.py
et il a couru sur l'interprète. Vous pouvez changer ce que vous voulez, pour tester sûr de savoir comment les choses se passe derrière les coulisses.C'est l'assembleur différence:
Source:
python >= 2.6,
si nous écrivons comme
va générer d'alerte,
Nous pouvons donc utiliser