He estado estudiando Python y leí un capítulo que describe el Nonevalor, 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 Nonevalor es y qué es lo que lo uso para?
Y también, no entiendo esta parte del libro:
Asignar un valor de
Nonea 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
Nonea 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

Noneno es un estado vacío predeterminado para variables.undef. también posiblemente javascript, aunque tiene ambosnullyundefined.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
Nonehay 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
Noneobjeto.Lo que Briggs te pide que imagines es que no escribiste la pegatina
"F", ya había unaFpegatina en elNone, y todo lo que hiciste fue moverla , deNonea"fork". Entonces, cuando escribeF = None, "lo restablece a su estado original y vacío", si decidimos tratarloNonecomo 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
NameErrorsignifica que Python no reconoce el nombreF, porque no existe dicha etiqueta . Si Briggs tenía razón y seF = NonerestableceFa su estado original, entonces debería estar allí ahora, y deberíamos vercomo lo hacemos después de escribir
F = Noney 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 = 2yc17 = 3.14, y luego puedes pegarlas en otros objetos más tarde (comoF = 10oF = None; todo es lo mismo .)Briggs finge que todas las etiquetas adhesivas posibles que desee escribir ya estaban pegadas al
Noneobjeto.fuente
Nonees 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
returndeclaración explícita ,Nonese devuelve, por ejemplo. De esa manera, la programación con funciones se simplifica mucho; una función siempre devuelve algo , incluso si es solo esaNoneobjeto.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,Nonese 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 tieneundefinedynull, 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
Nonees lo mismo que establecerlo en un valor vacío predeterminado;Nonetambié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
undefinedynull.undefinedes un objeto en JavaScript, y puede usar ese objeto explícitamente al igual queNoneen Python. Es un objeto de señal, con el mismo significado.NULLsigue 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
NoneprimeroSalida
Básicamente,
NoneTypees un tipo de datos comoint,floatetc. Puede consultar la lista de tipos predeterminados disponibles en Python en 8.15. tipos: nombres para los tipos integrados .Y,
Nonees una instancia deNoneTypeclase. Por lo tanto, podríamos querer crear instancias deNonenosotros mismos. Probemos esoSalida
Claramente, no se pueden crear
NoneTypeinstancias. No tenemos que preocuparnos por la unicidad del valorNone.Veamos cómo lo hemos implementado
Noneinternamente.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
NoneSalida
Las declaraciones vistas anteriormente producen estos mensajes de error, respectivamente. Significa que no podemos crear atributos dinámicamente en una
Noneinstancia.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
Nonees una instancia deNoneTypeNoneno puede tener nuevos atributosNoneno se pueden cambiar.NoneTypeNoneasignarle valores.Entonces, como se menciona en la documentación,
Nonerealmente 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
Nonevalor especial no es terriblemente importante en este caso. Podría haber usado cualquier valor predeterminado:... pero tener
Nonealrededor nos da dos beneficios:-1cuyo significado no está claro, y-1como una entrada normal.¡Uy!
Por lo tanto, el libro es un poco engañoso principalmente en su uso de la palabra restablecer : asignar
Noneun 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 ladelpalabra 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
des un diccionario,d.get(k)devolverád[k]si existe, peroNonesidno 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é
Nonees ú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.Nonesi es el resultado de la última expresión. (que es principalmente útil para las funciones que no están destinadas a devolver un valor).Nonesi ese es el resultado de una expresión, principalmente para no saturar la salida.fuente