375 votes

Est-il possible de déclarer une variable sans lui attribuer de valeur en Python ?

Est-il possible de déclarer une variable en Python, comme ceci :

var

pour qu'il soit initialisé à None ? Il semble que Python le permette, mais dès qu'on y accède, il se plante. Est-ce possible ? Si non, pourquoi ?

EDIT : Je veux faire ça pour des cas comme celui-ci :

value

for index in sequence:

   if value == None and conditionMet:
       value = index
       break

Duplicate

Related

1 votes

Peut poster un petit programme qui cause cela s'il vous plaît.

0 votes

Vous avez posté une question en double. Nous votons pour fermer cette question en faveur de l'autre.

0 votes

Il y a encore une différence, celle-ci concerne l'impossibilité d'utiliser une variable simplement en la déclarant.

451voto

tgamblin Points 25755

Pourquoi ne pas simplement faire ça :

var = None

Python est dynamique, donc vous n'avez pas besoin de déclarer les choses ; elles existent automatiquement dans la première portée où elles sont assignées. Ainsi, tout ce dont vous avez besoin est une bonne vieille instruction d'affectation comme ci-dessus.

C'est une bonne chose, car vous ne vous retrouverez jamais avec une variable non initialisée. Mais attention -- cela ne signifie pas que vous ne vous retrouverez pas avec incorrectement variables initialisées. Si vous initez quelque chose à None Assurez-vous que c'est ce que vous voulez vraiment, et attribuez quelque chose de plus significatif si vous le pouvez.

2 votes

J'allais le faire, mais j'ai juste pensé implicitement que ça ferait ça.

11 votes

Le but est que cela soit explicite, et non implicite. Il n'est pas nécessaire de deviner quelle est la valeur initiale. On ne se demande pas si une variable non initialisée lève une exception ou si, par magie, elle a une valeur utile.

2 votes

Le seul problème que j'ai rencontré est que j'ai gardé la trace d'un compteur (minValue) et que chaque fois qu'une valeur était inférieure à ce compteur, j'en faisais la nouvelle valeur minValue. Si j'ai déclaré minValue comme None à l'origine, alors apparemment elle est toujours inférieure à tous les nombres auxquels je l'ai comparée. J'ai fini par l'initialiser à sys.maxint.

59voto

J.F. Sebastian Points 102961

Je vous recommande chaleureusement de lire D'autres langues ont des "variables". (Je l'ai ajouté comme lien connexe) - en deux minutes, vous saurez que Python a des "noms" et non des "variables".

val = None
# ...
if val is None:
   val = any_object

1 votes

Vous pouvez également écrire val = val or any_object pour l'initialiser.

1 votes

@Zoltán : cela casse si une valeur valide pour val est "false", par exemple zéro ou vide. Utilisez is pour tester si une valeur est None .

2 votes

Après avoir lu l'article au lien fourni, il semble que ce ne soit guère plus qu'un sophisme sémantique.

16voto

kquinn Points 5788

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 les variables avant de les assigner ou de les utiliser. Je pense que ce que vous voulez faire est simplement

foo = None

qui attribuera la valeur None à la variable foo .

EDIT : Ce que vous vraiment semblent vouloir faire, c'est justement ça :

#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 c'est est une façon plus "pythique" de travailler.

EDIT : ci-dessous le commentaire de JFS (posté ici pour montrer le code)

Sans rapport avec la question de l'OP, 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)

REMARQUE : si some_condition() soulève une exception, alors found n'est pas lié.
NOTE : si len(séquence) == 0 alors item n'est pas lié.

Le code ci-dessus n'est pas conseillé. Son but est d'illustrer le fonctionnement des variables locales, à savoir si la "variable" est "définie" ne peut être déterminée qu'au moment de l'exécution dans ce cas. C'est préférable :

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)

0 votes

Y a-t-il une différence entre un langage dynamique et un langage très dynamique ?

0 votes

Il existe un excellent article expliquant les différents axes de typage des langages de programmation et le fait qu'il s'agit de continuums, et non de valeurs booléennes ; malheureusement, je ne retrouverai jamais cet article lorsque je voudrai le citer :( Je considère Python comme "très dynamique" parce qu'il se trouve à l'extrémité de plusieurs axes.

3voto

Johan Points 469

Eh bien, 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().

2voto

Andrew Hare Points 159332

D'habitude, j'initialise la variable avec 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()

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