45 votes

Différence entre "si x" et "si x n'est pas nul".

Il semble que "if x" soit presque un raccourci pour la syntaxe plus longue "if x is not None". Sont-elles identiques d'un point de vue fonctionnel ou existe-t-il des cas où, pour une valeur donnée de x, elles sont évaluées différemment ?

Je suppose que le comportement devrait également être identique dans toutes les implémentations Python - mais s'il existe des différences subtiles, il serait bon de le savoir.

61voto

systempuntoout Points 27584

Dans les cas suivants :

test = False 
test = "" 
test = 0
test = 0.0 
test = []
test = () 
test = {} 
test = set()

le site if Le test sera différent :

if test: #False

if test is not None: #True 

C'est le cas parce que is des tests d'identité, de sens

test is not None

est équivalent à

id(test) == id(None) #False

donc

(test is not None) is (id(test) != id(None)) #True

37voto

La première teste la véracité, tandis que la seconde teste l'identité avec les éléments suivants None . De nombreuses valeurs sont fausses, telles que False , 0 , '' et None mais seulement None es None .

5voto

eduffy Points 17061
x = 0
if x: ...  # False
if x is not None: ... # True

3voto

Ant Points 1953

if x vérifie si x est considéré comme True .

En Python, tout a une valeur booléenne ( True / False ).

Les valeurs qui sont considérées comme False :

  • False , None
  • 0 , 0.0 , 0j
  • [] , () , {}
  • ''
  • Autres instances qui signalent à Python qu'elles sont vides

Les autres valeurs sont considérées comme True . Par exemple, [False] , ('hello') , 'hello' sont considérés comme True (car ils ne sont pas vides).

Lorsque vous utilisez if x is not None vous vérifiez si x n'est pas None mais il peut être False ou d'autres instances qui sont considérées comme False .

>>> x = None
>>> if not x:print x # bool(None) is False
None
>>> if x == None:print x
None
>>> x = False
>>> if not x:print x
False
>>> if x == None:print x

Enfin, notez que True y False sont respectivement égales à 1 y 0 :

>>> True + 1
2
>>> False + 1
1
>>> range(1, 5)[False]
1

3voto

Koroviev Points 82
if x:
    # Evaluates for any defined non-False value of x
if not x:
    # Evaluates for any defined False value of x
if x is None:
    # Evaluates for any instances of None

Aucun n'est son propre type, qui se trouve être Faux. "if not x" évalue si x = None, uniquement parce que None est Faux.

Il n'y a pas de différences subtiles à ma connaissance, mais il existe des méthodes précises pour tester l'utilisation de la positivité/négativité dans des situations précises. Les mélanger peut fonctionner dans certaines situations, mais peut entraîner des problèmes si on ne les comprend pas.

if x is True:
    # Use for checking for literal instances of True
if x is False:
    # Use for checking for literal instances of False
if x is None:
    # Use for checking for literal instances of None
if x:
    # Use for checking for non-negative values
if not x:
    # Use for checking for negative values
    # 0, "", None, False, [], (), {} are negative, all others are True

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X