He estado estudiando Python y leí un capítulo que describe el None
valor, pero desafortunadamente este libro no es muy claro en algunos puntos. Pensé que encontraría la respuesta a mi pregunta, si la comparto allí.
Quiero saber lo que el None
valor es y qué es lo que lo uso para?
Y también, no entiendo esta parte del libro:
Asignar un valor de
None
a una variable es una forma de restablecerlo a su estado vacío original.
Qué significa eso?
Las respuestas fueron geniales, aunque no entendí la mayoría de las respuestas debido a mi bajo conocimiento del mundo de la informática (no he aprendido sobre clases, objetos, etc.). ¿Qué significa esta oración?
Asignar un valor de
None
a una variable es una forma de restablecerlo a su estado vacío original.
Final:
Finalmente obtuve mi respuesta al buscar diferentes respuestas. Debo agradecer a todas las personas que dedicaron su tiempo a ayudarme (especialmente a Martijn Pieters y DSM), y deseo poder elegir todas las respuestas como las mejores, pero la selección se limita a una. Todas las respuestas fueron geniales.
fuente
None
no es un estado vacío predeterminado para variables.undef
. también posiblemente javascript, aunque tiene ambosnull
yundefined
.undefined
, si se deja sin inicializar.null
, un punto que no puedo hacer a @MartijnPieters en su respuesta.Respuestas:
La respuesta de Martijn explica lo que
None
hay en Python, y afirma correctamente que el libro es engañoso. Como los programadores de Python, por regla general, nunca diríanEs difícil explicar lo que Briggs quiere decir de una manera que tenga sentido y explique por qué nadie aquí parece contento con eso. Una analogía que puede ayudar:
En Python, los nombres de las variables son como pegatinas colocadas en los objetos. Cada pegatina tiene un nombre único escrito, y solo puede estar en un objeto a la vez, pero puede poner más de una pegatina en el mismo objeto, si lo desea. Cuando escribes
pones la pegatina "F" en un objeto de cuerda
"fork"
. Si luego escribesmueves la pegatina al
None
objeto.Lo que Briggs te pide que imagines es que no escribiste la pegatina
"F"
, ya había unaF
pegatina en elNone
, y todo lo que hiciste fue moverla , deNone
a"fork"
. Entonces, cuando escribeF = None
, "lo restablece a su estado original y vacío", si decidimos tratarloNone
como significadoempty state
.Puedo ver a qué se dirige, pero esa es una mala manera de verlo. Si inicia Python y escribe
print(F)
, veráy eso
NameError
significa que Python no reconoce el nombreF
, porque no existe dicha etiqueta . Si Briggs tenía razón y seF = None
restableceF
a su estado original, entonces debería estar allí ahora, y deberíamos vercomo lo hacemos después de escribir
F = None
y poner la pegatinaNone
.Entonces eso es todo lo que está pasando. En realidad, Python viene con algunas pegatinas ya adheridas a los objetos (nombres incorporados), pero otras tienes que escribirlas con líneas como
F = "fork"
yA = 2
yc17 = 3.14
, y luego puedes pegarlas en otros objetos más tarde (comoF = 10
oF = None
; todo es lo mismo .)Briggs finge que todas las etiquetas adhesivas posibles que desee escribir ya estaban pegadas al
None
objeto.fuente
None
es solo un valor que comúnmente se usa para indicar 'vacío' o 'sin valor aquí'. Es un objeto señal ; solo tiene significado porque la documentación de Python dice que tiene ese significado.Solo hay una copia de ese objeto en una sesión de intérprete de Python dada.
Si escribe una función, y esa función no utiliza una
return
declaración explícita ,None
se devuelve, por ejemplo. De esa manera, la programación con funciones se simplifica mucho; una función siempre devuelve algo , incluso si es solo esaNone
objeto.Puedes probarlo explícitamente:
Otro uso es dar parámetros opcionales a las funciones por defecto 'vacío':
La función
spam()
tiene un argumento opcional; si llamaspam()
sin especificarlo,None
se le asigna el valor predeterminado , lo que facilita detectar si la función se llamó con un argumento o no.Otros idiomas tienen conceptos similares. SQL tiene
NULL
; JavaScript tieneundefined
ynull
, etc.Tenga en cuenta que en Python, las variables existen en virtud de ser utilizadas. No necesita declarar una variable primero, por lo que no hay variables realmente vacías en Python. Establecer una variable en no
None
es lo mismo que establecerlo en un valor vacío predeterminado;None
también es un valor, aunque uno que a menudo se usa para indicar el vacío. El libro que estás leyendo es engañoso en ese punto.fuente
undefined
ynull
.undefined
es un objeto en JavaScript, y puede usar ese objeto explícitamente al igual queNone
en Python. Es un objeto de señal, con el mismo significado.NULL
sigue siendo algo que puede asignarse y probarse explícitamente.Esto es lo que la documentación de Python tiene que decir sobre
None
:Confirmemos el tipo de
None
primeroSalida
Básicamente,
NoneType
es un tipo de datos comoint
,float
etc. Puede consultar la lista de tipos predeterminados disponibles en Python en 8.15. tipos: nombres para los tipos integrados .Y,
None
es una instancia deNoneType
clase. Por lo tanto, podríamos querer crear instancias deNone
nosotros mismos. Probemos esoSalida
Claramente, no se pueden crear
NoneType
instancias. No tenemos que preocuparnos por la unicidad del valorNone
.Veamos cómo lo hemos implementado
None
internamente.Salida
Excepto
__setattr__
, todos los demás son atributos de solo lectura. Por lo tanto, no hay forma de que podamos alterar los atributos deNone
.Probemos y agreguemos nuevos atributos a
None
Salida
Las declaraciones vistas anteriormente producen estos mensajes de error, respectivamente. Significa que no podemos crear atributos dinámicamente en una
None
instancia.Veamos qué sucede cuando asignamos algo
None
. Según la documentación, debe arrojar unSyntaxError
. Significa que si le asignamos algoNone
, el programa no se ejecutará en absoluto.Salida
Hemos establecido que
None
es una instancia deNoneType
None
no puede tener nuevos atributosNone
no se pueden cambiar.NoneType
None
asignarle valores.Entonces, como se menciona en la documentación,
None
realmente se puede considerar como untrue constant
.Feliz sabiendo
None
:)fuente
__setattr__
para NingunoEl libro al que se refiere está claramente tratando de simplificar enormemente el significado de
None
. Las variables de Python no tienen un estado inicial vacío: las variables de Python están vinculadas (solo) cuando se definen . No puede crear una variable de Python sin darle un valor.pero a veces quieres que una función signifique cosas diferentes dependiendo de si una variable está definida o no. Puede crear un argumento con un valor predeterminado de
None
:El hecho de que este valor sea el
None
valor especial no es terriblemente importante en este caso. Podría haber usado cualquier valor predeterminado:... pero tener
None
alrededor nos da dos beneficios:-1
cuyo significado no está claro, y-1
como una entrada normal.¡Uy!
Por lo tanto, el libro es un poco engañoso principalmente en su uso de la palabra restablecer : asignar
None
un nombre es una señal para un programador de que ese valor no se está utilizando o que la función debería comportarse de alguna manera predeterminada, sino restablecer un valor a su estado original e indefinido, debe usar ladel
palabra clave:fuente
Otras respuestas ya han explicado el significado de Ninguno maravillosamente. Sin embargo, todavía me gustaría arrojar más luz sobre esto usando un ejemplo.
Ejemplo:
Ahora intente adivinar la salida de la lista anterior. Bueno, la respuesta es sorprendentemente la siguiente:
¿Pero por qué?
Muchos esperarán erróneamente que list1 sea igual a [10] y list3 sea igual a ['a'] , pensando que el argumento list se establecerá en su valor predeterminado de [] cada vez que se llame a extendList.
Sin embargo, lo que realmente sucede es que la nueva lista predeterminada se crea solo una vez cuando se define la función , y esa misma lista se usa posteriormente cada vez que se invoca extendList sin especificar un argumento de lista. Esto se debe a que las expresiones en los argumentos predeterminados se calculan cuando se define la función, no cuando se llama .
por lo tanto, list1 y list3 están operando en la misma lista predeterminada, mientras que list2 está operando en una lista separada que creó (pasando su propia lista vacía como el valor para el parámetro de lista).
'Ninguno' el salvador: (Modifique el ejemplo anterior para producir el comportamiento deseado)
Con esta implementación revisada, el resultado sería:
Nota - Ejemplo de crédito a toptal.com
fuente
None es un objeto singleton (lo que significa que solo hay un None), utilizado en muchos lugares del idioma y la biblioteca para representar la ausencia de algún otro valor.
Por ejemplo:
si
d
es un diccionario,d.get(k)
devolverád[k]
si existe, peroNone
sid
no tiene clavek
.Lea esta información de un gran blog: http://python-history.blogspot.in/
fuente
Todas estas son buenas respuestas, pero creo que hay más para explicar por qué
None
es útil.Imagina que estás recogiendo RSVP para una boda. Desea registrar si asistirá cada persona. Si ellos asisten, tú pones
person.attending = True
. Si no están atendiendo tu setperson.attending = False
. Si no ha recibido ningún RSVP, entoncesperson.attending = None
. De esa manera, puede distinguir entre ninguna informaciónNone
, y una respuesta negativa.fuente
Me encantan los ejemplos de código (así como la fruta), así que déjame mostrarte
Ninguno significa nada, no tiene valor.
Ninguno se evalúa como Falso.
fuente
print(None)
grabados ..None
. Lo hace no , como usted sugiere, imprimir nada.None
si es el resultado de la última expresión. (que es principalmente útil para las funciones que no están destinadas a devolver un valor).None
si ese es el resultado de una expresión, principalmente para no saturar la salida.fuente