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"
191
demandé sur Community 2009-03-20 01:21:53

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.

247
répondu tgamblin 2009-03-19 22:50:19

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
50
répondu jfs 2015-03-04 21:39:28

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)
11
répondu kquinn 2009-03-20 07:55:06

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?"

5
répondu Tagar 2017-11-08 21:38:17

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()
4
répondu Andrew Hare 2009-03-19 22:24:31

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().

3
répondu Johan 2009-11-02 13:00:57

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)]
2
répondu Jerub 2009-03-19 22:59:51

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 
2
répondu fholo 2012-10-04 11:18:13

on dirait que vous essayez d'écrire C en Python. Si vous voulez trouver quelque chose dans une séquence, Python a des fonctions builtin pour le faire, comme

value = sequence.index(blarg)
1
répondu 2009-03-19 23:03:49
var_str = str()
var_int = int()
0
répondu Zaur 2014-09-12 08:14:14

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.

0
répondu zinturis 2016-11-16 16:17:09

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 .

0
répondu Chris_Rands 2016-12-05 22:38:21

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.

0
répondu ZAB 2018-01-15 02:13:37