¿Es posible solo declarar una variable sin asignar ningún valor en Python?

288

¿Es posible declarar una variable en Python, así ?:

var

para que se inicialice a Ninguno? Parece que Python lo permite, pero tan pronto como accedes a él, se bloquea. es posible? Si no, ¿por qué?

EDITAR: Quiero hacer esto para casos como este:

value

for index in sequence:

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

Duplicar

Relacionado

Joan Venge
fuente
1
puede publicar un pequeño programa que causa esto por favor.
Preet Sangha
Has publicado una pregunta duplicada, votando para cerrar esta pregunta a favor de la otra.
Jerub
Todavía hay alguna diferencia, esta trata con la imposibilidad de usar una variable con solo declarar.
Joan Venge
Realmente no existe tal cosa como declarar una variable en el mundo de Python, como explica su primera pregunta.
Harley Holcombe
1
¿Por qué nadie dijo "simplemente asignarlo" porque las variables no existen antes de que se asignen al punto? Y las variables en python no contienen la información de tipo. Los objetos hacen eso. Las variables son solo para sostener el objeto en ese momento. Además, el programa anterior debería generar una excepción NameError en la primera línea. (Eso es lo que obtengo en 2.X y 3.X ambos)
osirisgothra

Respuestas:

359

¿Por qué no solo hacer esto?

var = None

Python es dinámico, por lo que no necesita declarar cosas; existen automáticamente en el primer ámbito donde se asignan. Por lo tanto, todo lo que necesita es una declaración de asignación anterior normal como se indicó anteriormente.

Esto es bueno, porque nunca terminarás con una variable no inicializada. Pero tenga cuidado: esto no significa que no terminará con variables inicializadas incorrectamente . Si inicias algo None, asegúrate de que eso es lo que realmente quieres y asigna algo más significativo si puedes.

Todd Gamblin
fuente
1
Iba a hacer eso, pero pensé implícitamente que lo haría.
Joan Venge
77
El punto es que esto sea explícito, no implícito. Sin adivinar cuál es el valor inicial. No es de extrañar si una variable no inicializada arroja una excepción o mágicamente tiene un valor útil.
S.Lott
2
El único problema que tuve con esto fue que estaba haciendo un seguimiento de un contador (minValue) y cada vez que un valor era inferior a él, lo estaba configurando para convertirme en el nuevo minValue. Si declare minValue como None originalmente, entonces aparentemente todavía es más bajo que cualquier número con el que lo comparé. Terminé simplemente inicializándolo en sys.maxint
TJ Biddle
... existen automáticamente en el primer ámbito donde se asignan. Entonces, tienes que buscar esa primera tarea y resolverla. ugh!
Ed Randall
56

Recomiendo encarecidamente que lea Otros idiomas tienen "variables" (lo agregué como un enlace relacionado): en dos minutos sabrá que Python tiene "nombres", no "variables".

val = None
# ...
if val is None:
   val = any_object
jfs
fuente
También puedes escribir val = val or any_objectpara inicializarlo.
Zoltán
1
@ Zoltán: se rompe si un valor válido para val es "falso", por ejemplo, cero o vacío. Use ispara probar si un valor es None.
jfs
Después de leer el artículo en el enlace suministrado, parece ser poco más que un sofisma semántico.
Andrew P.
29

En Python 3.6+ puedes usar anotaciones variables para esto:

https://www.python.org/dev/peps/pep-0526/#abstract

PEP 484 introdujo sugerencias de tipo, también conocidas como anotaciones de tipo. Si bien su enfoque principal eran las anotaciones de función, también introdujo la noción de comentarios de tipo para anotar variables:

# 'captain' is a string (Note: initial value is a problem)
captain = ...  # type: str

PEP 526 tiene como objetivo agregar sintaxis a Python para anotar los tipos de variables (incluidas las variables de clase y las variables de instancia), en lugar de expresarlas a través de comentarios:

captain: str  # Note: no initial value!

Parece estar más directamente en línea con lo que estaba preguntando "¿Es posible declarar una variable solo sin asignar ningún valor en Python?"

Tagar
fuente
2
Excelente respuesta
Ben
16

No estoy seguro de lo que estás tratando de hacer. Python es un lenguaje muy dinámico; generalmente no necesita declarar variables hasta que realmente las va a asignar o usar. Creo que lo que quieres hacer es simplemente

foo = None

que asignará el valor Nonea la variable foo.

EDITAR: Lo que realmente parece querer hacer es solo esto:

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

Es un poco difícil saber si ese es realmente el estilo correcto para usar en un ejemplo de código tan corto, pero es una forma de trabajo más "pitónica".

EDITAR: a continuación hay un comentario de JFS (publicado aquí para mostrar el código)

Sin relación con la pregunta del OP, pero el código anterior se puede reescribir como:

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)

NOTA: si some_condition()genera una excepción, entonces foundno está consolidado.
NOTA: si len (secuencia) == 0 entonces itemno está consolidado.

El código anterior no es aconsejable. Su propósito es ilustrar cómo funcionan las variables locales, es decir, si la "variable" está "definida" podría determinarse solo en tiempo de ejecución en este caso. Forma preferible:

for item in sequence:
    if some_condition(item):
       do_something(item)
       break

O

found = False
for item in sequence:
    if some_condition(item):
       found = True
       break

if found:
   do_something(item)
kquinn
fuente
¿Hay alguna diferencia entre un lenguaje dinámico y un lenguaje muy dinámico?
Gavin Miller
Hay un gran artículo que explica los diferentes ejes de la tipificación del lenguaje de programación y cómo son continuos, no valores booleanos; por desgracia, nunca puedo encontrar que el artículo de nuevo cuando quiero citar que :( considero Python "muy dinámico" porque está en el otro extremo de múltiples ejes.
kquinn
3

Normalmente inicializo la variable a algo que denota el tipo como

var = ""

o

var = 0

Si va a ser un objeto, no lo inicialice hasta que lo instancia:

var = Var()
Andrew Hare
fuente
3

Bueno, si desea verificar si una variable está definida o no, ¿por qué no verificar si está en los arrays locals () o globals ()? Su código reescrito:

for index in sequence:
   if 'value' not in globals() and conditionMet:
       value = index
       break

Si está buscando una variable local, reemplace globals () con locales ().

Johan
fuente
2

Primero que nada, mi respuesta a la pregunta que originalmente hiciste

P: ¿Cómo descubro si una variable está definida en un punto de mi código?

R: Lea en el archivo fuente hasta que vea una línea donde se define esa variable.

Pero además, ha dado un ejemplo de código de que hay varias permutaciones que son bastante pitónicas. Buscas una forma de escanear una secuencia para buscar elementos que coincidan con una condición, así que aquí hay algunas soluciones:

def findFirstMatch(sequence):
    for value in sequence:
        if matchCondition(value):
            return value

    raise LookupError("Could not find match in sequence")

Claramente en este ejemplo podría reemplazar el raisecon unreturn None dependiendo de lo que quería lograr.

Si desea todo lo que coincide con la condición, puede hacer esto:

def findAllMatches(sequence):
    matches = []
    for value in sequence:
        if matchCondition(value):
            matches.append(value)

    return matches

Hay otra forma de hacer esto con la yieldque no me molestaré en mostrarte, porque es bastante complicado en la forma en que funciona.

Además, hay una forma de una línea de lograr esto:

all_matches = [value for value in sequence if matchCondition(value)]
Jerub
fuente
2

Si entiendo bien su ejemplo, no necesita hacer referencia al 'valor' en la declaración if de todos modos. Estás saliendo del círculo tan pronto como se pueda establecer en cualquier cosa.

value = None
for index in sequence:
   doSomethingHere
   if conditionMet:
       value = index
       break 
fholo
fuente
1

Parece que estás tratando de escribir C en Python. Si desea encontrar algo en una secuencia, Python tiene funciones integradas para hacer eso, como

value = sequence.index(blarg)

fuente
1

Es una buena pregunta y desafortunadamente respuestas malas ya var = Noneque ya está asignando un valor, y si su script se ejecuta varias veces, se sobrescribe Nonecada vez.

No es lo mismo que definir sin asignación. Todavía estoy tratando de descubrir cómo evitar este problema.

zinturis
fuente
1

¿Es posible declarar una variable en Python (var = None):

def decl_var(var=None):
if var is None:
    var = []
var.append(1)
return var
Abderrahim
fuente
0
var_str = str()
var_int = int()
Zaur
fuente
travieso travieso travieso hombre! las variables no asocian tipo, los objetos sí. var_str no debería estar restringido en un nombre tan genérico. Si va a hacer esto, hágalo significativo como 'var_age' o 'var_name' por ejemplo. Dichos valores pueden tomarse como enteros o cadenas o lo que desee, y cambiarse a objetos, el espíritu mismo de lo que hace que Python sea diferente de otros lenguajes. Dicen que si necesita hacer esto todo el tiempo, probablemente quiera usar otro idioma.
osirisgothra
0

Si Nonees un valor de datos válido, entonces necesita la variable de otra manera. Podrías usar:

var = object()

Este centinela es sugerido por Nick Coghlan .

Chris_Rands
fuente
0

Puede engañar a un intérprete con este feo oneliner. if None: var = None No hace nada más que agregar una variable varal diccionario de variables locales, no inicializarlo. El intérprete lanzará la excepción UnboundLocalError si intenta usar esta variable en una función después. Esto también funcionaría para versiones muy antiguas de python. No es simple ni hermoso, pero no esperes mucho de Python.

ZAB
fuente