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

8 minutos de lectura

avatar de usuario
joan venganza

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

var

para que se inicialice en Ninguno? Parece que Python permite esto, pero tan pronto como accedes, 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

preguntas relacionadas

  • ¿Por qué una función puede modificar algunos argumentos percibidos por la persona que llama, pero no otros?
  • Declaración de variables de Python

Ver también

  • Ha publicado una pregunta duplicada, votando para cerrar esta pregunta a favor de la otra.

    – Jerub

    19 de marzo de 2009 a las 23:18

  • Todavía hay alguna diferencia, esta se trata de no poder usar una variable simplemente declarando.

    – Joan venganza

    19 de marzo de 2009 a las 23:36

  • Realmente no existe tal cosa como declarar una variable en el mundo de python, como explica su primera pregunta.

    –Harley Holcombe

    20 de marzo de 2009 a las 2:32

  • ¿Por qué nadie dijo nunca ‘simplemente asígnelo’ porque las variables no existen antes de que se asignen al período? 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 lanzar una excepción NameError en la primera línea. (Eso es lo que obtengo en 2.X y 3.X ambos)

    – osirisgothra

    9 de julio de 2015 a las 5:11

avatar de usuario
Todd Gamblin

¿Por qué no 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. Entonces, todo lo que necesita es una declaración de asignación anterior regular como la anterior.

Esto es bueno, porque nunca terminará con una variable sin inicializar. Pero tenga cuidado, esto no significa que no terminará con incorrectamente variables inicializadas. Si inicias algo para Noneasegúrese de que eso es lo que realmente quiere y asigne algo más significativo si puede.

  • Iba a hacer eso, pero pensé implícitamente que haría eso.

    – Joan venganza

    19 de marzo de 2009 a las 22:50

  • 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 genera una excepción o mágicamente tiene un valor útil.

    – S. Lott

    19 de marzo de 2009 a las 23:31

  • El único problema que tengo con esto es que estaba haciendo un seguimiento de un contador (minValue) y cada vez que un valor era más bajo que él, lo configuraba para que se convirtiera en el nuevo minValue. Si declaré minValue como Ninguno originalmente, aparentemente sigue siendo más bajo que cualquier número con el que lo comparé. Terminé simplemente inicializándolo en sys.maxint

    – TJ Biddle

    29 mayo 2012 a las 17:41

  • …existen automáticamente en el primer ámbito donde se asignan. Entonces, tienes que buscar esa primera tarea y resolverla. ¡puaj!

    –Ed Randall

    9 de noviembre de 2017 a las 9:39


  • El objeto ‘NoneType’ no se puede suscribir

    -Robin Mollah

    25 de mayo a las 19:53

avatar de usuario
Tágar

En Python 3.6+, podría 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 funciones, 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 solo declarar una variable sin asignar ningún valor en Python?”

Nota: El tiempo de ejecución de Python no aplica anotaciones de función y tipo de variable. Pueden ser utilizados por herramientas de terceros, como verificadores de tipo, IDE, linters, etc.

  • Debería ser la respuesta aceptada (en este punto de la evolución de Python, etc.)

    – scharfmn

    10 de junio de 2021 a las 14:01

  • Re “Nota: ¡sin valor inicial!”: en realidad tampoco crea la variable. Intentando acceder captain antes de asignar un valor provocará el mismo NameError como hubiera sido de otra manera. Por otro lado, el código tampoco impone ninguna restricción sobre lo que se puede asignar. Código como captain: strsi bien es válido en 3.6 y versiones posteriores, tiene sin efecto en Python mismo; es solamente potencialmente utilizado por herramientas de verificación de tipos de terceros.

    – Karl Knechtel

    28 de junio a las 21:12

  • @KarlKnechtel sí, esto se menciona en PEP 526, agregué esa nota, gracias

    – Tágar

    20 de julio a las 22:11

avatar de usuario
jfs

Te recomiendo de todo corazón que leas 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

  • También podrías escribir val = val or any_object para inicializarlo.

    – Zoltán

    18 de diciembre de 2013 a las 22:29

  • @Zoltán: se rompe si un valor válido para val es “falso”, por ejemplo, cero o vacío. Usar is para comprobar si un valor es None.

    – jfs

    19 de diciembre de 2013 a las 2:14

  • Después de leer el artículo en el enlace proporcionado, parece ser poco más que un sofisma semántico.

    – Andrés P.

    15/03/2018 a las 22:50

  • @AndrewP.: no lo descarte tan fácilmente. Mantengo mi recomendación después de todos estos años. El modelo “nametag -> balloon” es muy simple y, al mismo tiempo, describe bien el comportamiento de vinculación de nombres en Python.

    – jfs

    11 abr a las 7:05

avatar de usuario
kquinn

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

foo = None

que le asignará el valor None a la variable foo.

EDITO: lo que tu De Verdad parece querer hacer es sólo 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 a partir de un ejemplo de código tan corto, pero es una forma más “Pythonic” de trabajar.

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

No relacionado 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() lanza una excepción entonces found está desatado.
NOTA: si len(secuencia) == 0 entonces item está desatado.

El código anterior no es recomendable. Su propósito es ilustrar cómo funcionan las variables locales, es decir, si “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)

Bueno, si desea verificar si una variable está definida o no, ¿por qué no verificar si está en las matrices locales () o globales ()? Tu código reescrito:

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

Si lo que está buscando es una variable local, reemplace globals() con locals().

avatar de usuario
Andrés Liebre

Por lo general, inicializo la variable en algo que denota el tipo como

var = ""

o

var = 0

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

var = Var()

avatar de usuario
Jerub

En primer lugar, mi respuesta a la pregunta que me hiciste originalmente

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 en el que hay varias permutaciones que son bastante pitónicas. Está buscando una forma de escanear una secuencia en busca de 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ías reemplazar el raise con un return None dependiendo de lo que querías lograr.

Si quisiera todo lo que coincidiera con la condición, podría 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 yield que no me molestaré en mostrártelo, 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)]

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad