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
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
Tágar
En Python 3.6+, podría usar anotaciones variables para esto:
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
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
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().
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()
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?
Tu feedback nos ayuda a saber si la solución es correcta y está funcionando. De esta manera podemos revisar y corregir el contenido.
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
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