Est-il seulement possible de déclarer une variable sans attribuer de valeur en Python?
Est-il possible de déclarer une variable en Python, comme?:
var
pour qu'il ne s'initialise à rien? Il semble que Python autorise cela, mais dès que vous y accédez, il se bloque. Est-ce possible? Si non, pourquoi?
EDIT: je veux faire cela pour les cas comme cela:
value
for index in sequence:
if value == None and conditionMet:
value = index
break
Dupliquer
- valeur non initialisée en python (par le même auteur))
- y a-t-il des mots clés de déclaration en Python? (par le même auteur)
Liées
- Python: portée des variables et des appels de fonction
- les autres langues ont des "variables"
13 réponses
Pourquoi ne pas simplement faire ceci:
var = None
Python est dynamique, donc vous n'avez pas besoin de déclarer des choses; elles existent automatiquement dans la première portée où elles sont assignées. Donc, tout ce que vous avez besoin est une vieille déclaration d'affectation régulière comme ci-dessus.
c'est bien, parce que vous ne finirez jamais avec une variable non initialisée. Mais attention -- cela ne veut pas dire que vous ne finirez pas avec incorrectement variables initialisées. Si vous avez quelque chose à None
, assurez-vous que c'est ce que vous voulez vraiment, et assignez quelque chose de plus significatif si vous le pouvez.
je vous recommande vivement de lire les autres langues ont des" variables " (Je l'ai ajouté comme lien) – dans deux minutes vous saurez que Python a des" noms", pas des"variables".
val = None
# ...
if val is None:
val = any_object
je ne suis pas sûr de ce que vous essayez de faire. Python est un langage très dynamique; vous n'avez généralement pas besoin de déclarer des variables tant que vous n'allez pas les assigner ou les utiliser. Je pense que ce que vous voulez faire est de simplement
foo = None
qui assignera la valeur None
à la variable foo
.
EDIT: Ce que vous vraiment semblent vouloir faire est de simplement ceci:
#note how I don't do *anything* with value here
#we can just start using it right inside the loop
for index in sequence:
if conditionMet:
value = index
break
try:
doSomething(value)
except NameError:
print "Didn't find anything"
Il est un peu difficile de dire si c'est vraiment le bon style à utiliser à partir d'un exemple de code aussi court, mais il est une façon plus "pythonique" de travailler.
EDIT: ci-dessous est le commentaire de JFS (posté ici pour montrer le code)
sans rapport avec la question de L'OP, mais le code ci-dessus peut être réécrit comme suit:
for item in sequence:
if some_condition(item):
found = True
break
else: # no break or len(sequence) == 0
found = False
if found:
do_something(item)
NOTE: Si some_condition()
soulève une exception, alors found
est non consolidé.
NOTE: si len(sequence) == 0, alors item
est non consolidé.
Le code ci-dessus n'est pas conseillé. Son but est d'illustrer comment les variables locales fonctionnent, à savoir si "variable" est "défini" pourrait être déterminé seulement à l'exécution dans ce cas. De préférence:
for item in sequence:
if some_condition(item):
do_something(item)
break
ou
found = False
for item in sequence:
if some_condition(item):
found = True
break
if found:
do_something(item)
en Python 3.6+ vous pouvez utiliser des Annotations variables pour ceci:
https://www.python.org/dev/peps/pep-0526/#abstract
PEP 484 introduced type hints,A. K. A. type annotations. Alors que son principal objectif était les annotations de fonction, il a également introduit la notion de type de commentaires pour annoter les variables:
# 'captain' is a string (Note: initial value is a problem)
captain = ... # type: str
PEP 526 vise à ajouter de la syntaxe à Python pour annoter les types de variables (y compris les variables de classe et les variables d'instance), au lieu de les exprimer par des commentaires:
captain: str # Note: no initial value!
il semble être plus en ligne directe avec ce que vous demandiez "est - il possible seulement de déclarer une variable sans assigner aucune valeur en Python?"
j'initialise habituellement la variable à quelque chose qui dénote le type comme
var = ""
ou
var = 0
S'il s'agit d'un objet, ne l'initialisez pas avant de l'avoir instancié:
var = Var()
si vous voulez vérifier si une variable est définie ou non, pourquoi ne pas vérifier si elle est dans les tableaux locals() ou globals ()? Votre code réécrit:
for index in sequence:
if 'value' not in globals() and conditionMet:
value = index
break
si c'est une variable locale que vous recherchez, remplacez globals() par locals().
tout d'abord, ma réponse à la question que vous m'avez posée à l'origine
Q: Comment savoir si une variable est définie à un point de mon code?
: Lire dans le fichier source jusqu'à ce que vous voyez une ligne lorsque cette variable est définie.
mais de plus, vous avez donné un exemple de code qu'il y a plusieurs permutations qui sont tout à fait pythoniques. Vous cherchez un moyen de scanner une séquence pour les éléments qui correspondent à une condition, voici donc quelques solutions:
def findFirstMatch(sequence):
for value in sequence:
if matchCondition(value):
return value
raise LookupError("Could not find match in sequence")
dans cet exemple, il est évident que vous pourriez remplacer le raise
par un return None
selon ce que vous voulez accomplir.
si vous vouliez tout ce qui correspondait à la condition, vous pourriez le faire:
def findAllMatches(sequence):
matches = []
for value in sequence:
if matchCondition(value):
matches.append(value)
return matches
il y a une autre façon de le faire avec yield
que je ne vais pas prendre la peine de vous montrer, parce que c'est assez compliqué dans la façon dont il fonctionne.
de plus, il y a une seule façon d'y parvenir:
all_matches = [value for value in sequence if matchCondition(value)]
si je comprends bien votre exemple, vous n'avez pas besoin de faire référence à la "valeur" dans l'instruction if de toute façon. Vous sortez de la boucle dès qu'elle peut être réglée sur quoi que ce soit.
value = None
for index in sequence:
doSomethingHere
if conditionMet:
value = index
break
c'est une bonne question et malheureusement de mauvaises réponses comme var = None
est déjà en train d'attribuer une valeur, et si votre script tourne plusieurs fois il est écrasé par None
à chaque fois.
ce n'est pas la même chose que de définir sans assignation. Je suis encore à essayer de comprendre comment contourner ce problème.
si None
est une valeur de données valide alors vous avez besoin de la variable d'une autre manière. Vous pouvez utiliser:
var = object()
cette sentinelle est suggérée par Nick Coghlan .
vous pouvez tromper un interprète avec ce vilain oneliner if None: var = None
Il ne fait rien d'autre que d'ajouter une variable var
au dictionnaire de variables local, et non de l'initialiser. Interpréteur lancera l'exception UnboundLocalError si vous essayez d'utiliser cette variable dans une fonction après. Cela fonctionnerait aussi pour les versions très anciennes de python. Pas simple, ni beau, mais n'attendez pas beaucoup de python.