J'ai étudié Python et j'ai lu un chapitre qui décrit la None
valeur, mais malheureusement, ce livre n'est pas très clair à certains moments. J'ai pensé que je trouverais la réponse à ma question, si je la partage là-bas.
Je veux savoir ce que la None
valeur est et ce que l' utilisez - vous pour?
Et aussi, je ne comprends pas cette partie du livre:
Attribuer une valeur de
None
à une variable est un moyen de la réinitialiser à son état vide d'origine.
Qu'est-ce que ça veut dire?
Les réponses étaient excellentes, même si je n'ai pas compris la plupart des réponses en raison de ma faible connaissance du monde informatique (je n'ai pas appris sur les classes, les objets, etc.). Qu'est-ce que cette phrase veut dire?
Attribuer une valeur de
None
à une variable est un moyen de la réinitialiser à son état vide d'origine.
Final:
Enfin, j'ai ma réponse en regardant différentes réponses. Je dois apprécier toutes les personnes qui mettent leur temps à m'aider (en particulier Martijn Pieters et DSM), et j'aimerais pouvoir choisir toutes les réponses comme étant les meilleures, mais la sélection est limitée à une. Toutes les réponses étaient excellentes.
la source
None
n'est pas un état vide par défaut pour les variables.undef
. aussi sans doute javascript, bien qu'il ait à la foisnull
etundefined
.undefined
, si elle n'est pas initialisée.null
un point que je ne parviens pas à faire valoir à @MartijnPieters dans sa réponse.Réponses:
La réponse de Martijn explique ce qu'il
None
y a en Python et déclare correctement que le livre est trompeur. Puisque les programmeurs Python en règle générale ne diraient jamaisil est difficile d'expliquer ce que Briggs signifie d'une manière qui a du sens et explique pourquoi personne ici ne semble satisfait de cela. Une analogie qui peut aider:
En Python, les noms de variables sont comme des autocollants placés sur des objets. Chaque autocollant a un nom unique écrit dessus, et il ne peut être que sur un objet à la fois, mais vous pouvez mettre plus d'un autocollant sur le même objet, si vous le souhaitez. Quand tu écris
vous mettez l'autocollant "F" sur un objet string
"fork"
. Si vous écrivez ensuitevous déplacez l'autocollant sur l'
None
objet.Ce que Briggs vous demande d'imaginer, c'est que vous n'avez pas écrit l'autocollant
"F"
, il y avait déjà unF
autocollant sur leNone
, et tout ce que vous avez fait a été de le déplacer , deNone
à"fork"
. Ainsi, lorsque vous tapezF = None
, vous le «remettez [ting] à son état vide d'origine», si nous décidons de le traiterNone
comme un sensempty state
.Je peux voir ce qu'il veut, mais c'est une mauvaise façon de voir les choses. Si vous démarrez Python et tapez
print(F)
, vous voyezet cela
NameError
signifie que Python ne reconnaît pas le nomF
, car un tel autocollant n'existe pas . Si Briggs avait raison et seF = None
réinitialiseF
à son état d'origine, alors il devrait être là maintenant, et nous devrions voircomme nous le faisons après avoir tapé
F = None
et mis l'autocollantNone
.C'est donc tout ce qui se passe. En réalité, Python est livré avec des autocollants déjà attachés aux objets (noms intégrés), mais d'autres, vous devez vous écrire avec des lignes comme
F = "fork"
etA = 2
etc17 = 3.14
, puis vous pouvez les coller sur d'autres objets plus tard (commeF = 10
ouF = None
; c'est tout de même .)Briggs prétend que tous les autocollants possibles que vous pourriez vouloir écrire étaient déjà collés à l'
None
objet.la source
None
est juste une valeur couramment utilisée pour signifier «vide» ou «aucune valeur ici». C'est un objet signal ; il n'a de sens que parce que la documentation Python dit qu'il a cette signification.Il n'y a qu'une seule copie de cet objet dans une session d'interpréteur Python donnée.
Si vous écrivez une fonction et que cette fonction n'utilise pas d'
return
instruction explicite , elleNone
est renvoyée à la place, par exemple. De cette façon, la programmation avec des fonctions est beaucoup plus simple; une fonction renvoie toujours quelque chose , même si ce n'est que cetNone
objet.Vous pouvez le tester explicitement:
Une autre utilisation est de donner aux fonctions des paramètres optionnels par défaut 'vide':
La fonction
spam()
a un argument facultatif; si vous appelezspam()
sans le spécifier, la valeur par défautNone
lui est donnée, ce qui permet de détecter facilement si la fonction a été appelée avec un argument ou non.D'autres langues ont des concepts similaires. SQL a
NULL
; JavaScript aundefined
etnull
, etc.Notez qu'en Python, les variables existent parce qu'elles sont utilisées. Vous n'avez pas besoin de déclarer une variable au préalable, il n'y a donc pas de variables vraiment vides en Python. Définir une variable sur
None
n'est alors pas la même chose que la définir sur une valeur vide par défaut;None
est également une valeur, même si elle est souvent utilisée pour signaler le vide. Le livre que vous lisez est trompeur sur ce point.la source
undefined
etnull
.undefined
est un objet en JavaScript, et vous pouvez utiliser cet objet explicitement comme vous pouvez l'utiliserNone
en Python. C'est un objet signal, avec à peu près la même signification.NULL
c'est toujours quelque chose qui peut être assigné et testé explicitement.Voici ce que la documentation Python a à dire sur
None
:Confirmons le type de
None
premierProduction
Au fond,
NoneType
est un type de données commeint
,float
etc. Vous pouvez consulter la liste des types par défaut disponible en Python 8,15. types - Noms des types intégrés .Et,
None
est une instance deNoneType
classe. Nous pourrions donc vouloir créer des instances deNone
nous - mêmes. Essayons çaProduction
Si clairement, ne peut pas créer d'
NoneType
instances. Nous n'avons pas à nous soucier de l'unicité de la valeurNone
.Vérifions comment nous avons mis en œuvre en
None
interne.Production
Sauf que
__setattr__
tous les autres sont des attributs en lecture seule. Il n'y a donc aucun moyen de modifier les attributs deNone
.Essayons d'ajouter de nouveaux attributs à
None
Production
Les instructions vues ci-dessus produisent respectivement ces messages d'erreur. Cela signifie que nous ne pouvons pas créer d'attributs dynamiquement sur une
None
instance.Voyons ce qui se passe lorsque nous attribuons quelque chose
None
. Selon la documentation, il devrait lancer un fichierSyntaxError
. Cela signifie que si nous attribuons quelque chose àNone
, le programme ne sera pas exécuté du tout.Production
Nous avons établi que
None
est une instance deNoneType
None
ne peut pas avoir de nouveaux attributsNone
ne peuvent pas être modifiés.NoneType
None
en lui attribuant des valeurs.Ainsi, comme mentionné dans la documentation,
None
peut vraiment être considéré comme un fichiertrue constant
.Heureux de savoir
None
:)la source
__setattr__
pour NoneLe livre auquel vous faites référence essaie clairement de simplifier considérablement le sens de
None
. Les variables Python n'ont un état initial, vide - les variables Python sont liées (seulement) quand ils sont définis . Vous ne pouvez pas créer une variable Python sans lui donner une valeur.mais parfois vous voulez faire en sorte qu'une fonction ait une signification différente selon qu'une variable est définie ou non. Vous pouvez créer un argument avec une valeur par défaut de
None
:Le fait que cette valeur soit la
None
valeur spéciale n'est pas très important dans ce cas. J'aurais pu utiliser n'importe quelle valeur par défaut:… Mais avoir
None
autour nous donne deux avantages:-1
dont la signification n'est pas claire, et-1
comme une entrée normale.Oups!
Donc, le livre est un peu trompeur principalement dans son utilisation du mot reset - attribuer
None
à un nom est un signal à un programmeur que cette valeur n'est pas utilisée ou que la fonction doit se comporter d'une manière par défaut, mais pour réinitialiser une valeur dans son état d'origine non défini, vous devez utiliser ledel
mot - clé:la source
D'autres réponses ont déjà expliqué magnifiquement la signification de None . Cependant, je voudrais encore jeter plus de lumière sur cela en utilisant un exemple.
Exemple:
Maintenant, essayez de deviner la sortie de la liste ci-dessus. Eh bien, la réponse est étonnamment comme ci-dessous:
Mais pourquoi?
Beaucoup s'attendront à tort à ce que list1 soit égal à [10] et list3 à ['a'] , pensant que l'argument de la liste sera mis à sa valeur par défaut de [] chaque fois que extendList est appelé.
Cependant, ce qui se passe réellement est que la nouvelle liste par défaut est créée une seule fois lorsque la fonction est définie , et cette même liste est ensuite utilisée par la suite chaque fois que extendList est invoqué sans qu'un argument de liste ne soit spécifié. En effet, les expressions dans les arguments par défaut sont calculées lorsque la fonction est définie, pas lorsqu'elle est appelée .
list1 et list3 fonctionnent donc sur la même liste par défaut, tandis que list2 opère sur une liste séparée qu'elle a créée (en passant sa propre liste vide comme valeur du paramètre de liste).
'Aucun' le sauveur: (Modifiez l'exemple ci-dessus pour produire le comportement souhaité)
Avec cette mise en œuvre révisée, le résultat serait:
Remarque - Exemple de crédit à toptal.com
la source
None est un objet singleton (ce qui signifie qu'il n'y a qu'un seul None), utilisé à de nombreux endroits dans le langage et la bibliothèque pour représenter l'absence d'une autre valeur.
Par exemple:
si
d
est un dictionnaire,d.get(k)
retournerad[k]
s'il existe, maisNone
sid
n'a pas de clék
.Lisez ces informations sur un excellent blog: http://python-history.blogspot.in/
la source
Toutes ces réponses sont de bonnes réponses, mais je pense qu'il y a plus à expliquer pourquoi
None
est utile.Imaginez que vous collectiez des RSVP pour un mariage. Vous voulez enregistrer si chaque personne sera présente. S'ils sont présents, vous définissez
person.attending = True
. S'ils ne sont pas présents, vous définissezperson.attending = False
. Si vous n'avez reçu aucun RSVP, alorsperson.attending = None
. De cette façon, vous pouvez faire la distinction entre aucune information -None
- et une réponse négative.la source
J'adore les exemples de code (ainsi que les fruits), alors laissez-moi vous montrer
Aucun ne veut rien dire, cela n'a aucune valeur.
Aucun est évalué à False.
la source
print(None)
impressions ..None
. Il ne pas , comme vous le suggérez, rien d'impression.None
si c'est le résultat de la dernière expression. (ce qui est surtout utile pour les fonctions qui ne sont pas destinées à renvoyer une valeur.)None
si cela est le résultat d'une expression, principalement pour ne pas encombrer la sortie.la source