Eu estudei Python e li um capítulo que descreve o None
valor, mas infelizmente este livro não é muito claro em alguns momentos. Eu pensei que encontraria a resposta para minha pergunta, se a compartilhar lá.
Eu quero saber o que o None
valor é eo que você usá-lo?
E também, eu não entendo essa parte do livro:
A atribuição de um valor de
None
a uma variável é uma maneira de redefini-la para seu estado vazio original.
O que isso significa?
As respostas foram ótimas, embora eu não tenha entendido a maioria das respostas devido ao meu baixo conhecimento do mundo da computação (não aprendi sobre classes, objetos etc.). O que está frase significa?
A atribuição de um valor de
None
a uma variável é uma maneira de redefini-la para seu estado vazio original.
Final:
Finalmente, recebi minha resposta procurando respostas diferentes. Devo agradecer a todas as pessoas que dedicam seu tempo para me ajudar (especialmente Martijn Pieters e DSM) e gostaria de poder escolher todas as respostas como as melhores, mas a seleção é limitada a uma. Todas as respostas foram ótimas.
fonte
None
não é um estado vazio padrão para variáveis.undef
. também sem dúvida javascript, embora tenha ambosnull
eundefined
.undefined
, se não for inicializado.null
, um ponto que deixo de mencionar ao @MartijnPieters em sua resposta.Respostas:
A resposta de Martijn explica o que
None
está em Python e afirma corretamente que o livro é enganoso. Como os programadores Python, em regra, nunca diriamé difícil explicar o que Briggs quer dizer de uma maneira que faça sentido e explique por que ninguém aqui parece feliz com isso. Uma analogia que pode ajudar:
No Python, nomes de variáveis são como adesivos colocados em objetos. Cada adesivo possui um nome exclusivo, e só pode estar em um objeto por vez, mas você pode colocar mais de um adesivo no mesmo objeto, se desejar. Quando você escreve
você coloca o adesivo "F" em um objeto de string
"fork"
. Se você escrevervocê move o adesivo para o
None
objeto.O que Briggs está pedindo para você imaginar é que você não escreveu o adesivo
"F"
, já havia umF
adesivo no adesivoNone
e tudo o que você fez foi movê- lo, deNone
para"fork"
. Então, quando você digitaF = None
, está "redefinindo-o para seu estado original e vazio", se decidirmos tratarNone
como significadoempty state
.Eu posso ver o que ele está dizendo, mas essa é uma maneira ruim de ver. Se você iniciar o Python e digitar
print(F)
, veráe isso
NameError
significa que o Python não reconhece o nomeF
, porque não existe esse adesivo . Se Briggs estava certo eF = None
redefiniuF
para seu estado original, ele deveria estar lá agora, e deveríamos vercomo fazemos depois de digitar
F = None
e colocar o adesivoNone
.Então é isso que está acontecendo. Na realidade, o Python vem com alguns adesivos já anexados aos objetos (nomes embutidos), mas outros você precisa escrever com linhas como
F = "fork"
eA = 2
ec17 = 3.14
, e então pode colá-los em outros objetos mais tarde (comoF = 10
ouF = None
; é tudo a mesma coisa) .)Briggs está fingindo que todos os adesivos possíveis que você pode querer escrever já estavam grudados no
None
objeto.fonte
None
é apenas um valor que geralmente é usado para significar 'vazio' ou 'sem valor aqui'. É um objeto de sinal ; ele só tem significado porque a documentação do Python diz que tem esse significado.Há apenas uma cópia desse objeto em uma determinada sessão de intérprete Python.
Se você escrever uma função e essa função não usar uma
return
declaração explícita ,None
será retornado, por exemplo. Dessa forma, a programação com funções é muito simplificada; uma função sempre retorna algo , mesmo que seja apenas esseNone
objeto.Você pode testá-lo explicitamente:
Outro uso é fornecer parâmetros opcionais para funções como um padrão 'vazio':
A função
spam()
tem um argumento opcional; se você chamarspam()
sem especificá-lo, o valor padrãoNone
será fornecido, facilitando a detecção se a função foi chamada com um argumento ou não.Outras línguas têm conceitos semelhantes. SQL tem
NULL
; JavaScript temundefined
enull
etc.Observe que no Python, existem variáveis em virtude de serem usadas. Você não precisa declarar uma variável primeiro, portanto, não existem variáveis realmente vazias no Python. Definir uma variável como
None
não é a mesma coisa que configurá-la para um valor vazio padrão;None
também é um valor, embora seja frequentemente usado para sinalizar vazio. O livro que você está lendo é enganoso nesse ponto.fonte
undefined
enull
.undefined
é um objeto em JavaScript, e você pode usá-lo explicitamente, assim comoNone
em Python. É um objeto de sinal, com o mesmo significado.NULL
ainda é algo que pode ser atribuído e testado explicitamente.Isto é o que a documentação do Python tem a dizer sobre
None
:Vamos confirmar o tipo de
None
primeiroResultado
Basicamente,
NoneType
é um tipo de dados comoint
,float
etc. Você pode conferir a lista de tipos padrão disponíveis no Python na 8.15. types - Nomes para tipos internos .E,
None
é uma instância deNoneType
classe. Então, podemos querer criar instâncias deNone
nós mesmos. Vamos tentar issoResultado
Tão claramente, não é possível criar
NoneType
instâncias. Não precisamos nos preocupar com a singularidade do valorNone
.Vamos verificar como implementamos
None
internamente.Resultado
Exceto que
__setattr__
todos os outros são atributos somente leitura. Portanto, não há como alterar os atributos deNone
.Vamos tentar adicionar novos atributos ao
None
Resultado
As instruções vistas acima produzem essas mensagens de erro, respectivamente. Isso significa que, não podemos criar atributos dinamicamente em uma
None
instância.Vamos verificar o que acontece quando atribuímos algo
None
. De acordo com a documentação, deve lançar aSyntaxError
. Isso significa que, se atribuirmos algo aNone
, o programa não será executado.Resultado
Nós estabelecemos que
None
é uma instância deNoneType
None
não pode ter novos atributosNone
não podem ser alterados.NoneType
None
atribuindo valores a ela.Portanto, como mencionado na documentação,
None
pode realmente ser considerado como umtrue constant
.Feliz saber
None
:)fonte
__setattr__
para NenhumO livro a que você se refere está claramente tentando simplificar bastante o significado de
None
. As variáveis Python não têm um estado vazio inicial - as variáveis Python são vinculadas (apenas) quando definidas . Você não pode criar uma variável Python sem atribuir um valor a ela.mas às vezes você quer fazer uma função significar coisas diferentes, dependendo de uma variável ser definida ou não. Você pode criar um argumento com um valor padrão de
None
:O fato de esse valor ser o
None
valor especial não é muito importante nesse caso. Eu poderia ter usado qualquer valor padrão:… Mas ter por
None
perto nos dá dois benefícios:-1
cujo significado não esteja claro, e-1
como uma entrada normal.oops!
Portanto, o livro é um pouco enganador principalmente no uso da palavra reset - atribuir
None
a um nome é um sinal para um programador de que esse valor não está sendo usado ou que a função deve se comportar de alguma maneira padrão, mas para redefinir um valor para seu estado original e indefinido, você deve usar adel
palavra-chave:fonte
Outras respostas já explicaram o significado de Nenhum lindamente. No entanto, eu ainda gostaria de esclarecer isso usando um exemplo.
Exemplo:
Agora tente adivinhar a saída da lista acima. Bem, a resposta é surpreendentemente como abaixo:
Mas por que?
Muitos esperam erroneamente que a lista1 seja igual a [10] e a lista3 seja igual a ['a'] , pensando que o argumento da lista será definido com o valor padrão de [] toda vez que o extendedList for chamado.
No entanto, o que realmente acontece é que a nova lista padrão é criada apenas uma vez quando a função é definida e a mesma lista é usada posteriormente sempre que o extendList é chamado sem que um argumento da lista seja especificado. Isso ocorre porque as expressões nos argumentos padrão são calculadas quando a função é definida, não quando é chamada .
list1 e list3 estão, portanto, operando na mesma lista padrão, enquanto list2 está operando em uma lista separada criada (passando sua própria lista vazia como o valor do parâmetro list).
'Nenhum' o salvador: (Modifique o exemplo acima para produzir o comportamento desejado)
Com esta implementação revisada, a saída seria:
Nota - Exemplo de crédito para toptal.com
fonte
Nenhum é um objeto singleton (significando que existe apenas um Nenhum), usado em muitos lugares no idioma e na biblioteca para representar a ausência de algum outro valor.
Por exemplo:
se
d
for um dicionário,d.get(k)
retornarád[k]
se existir, masNone
sed
não tiver chavek
.Leia essas informações em um ótimo blog: http://python-history.blogspot.in/
fonte
Todas essas são boas respostas, mas acho que há mais para explicar por que
None
é útil.Imagine você coletando RSVPs para um casamento. Você deseja registrar se cada pessoa comparecerá. Se eles estiverem participando, você define
person.attending = True
. Se eles não estiverem participando do seu conjuntoperson.attending = False
. Se você não recebeu nenhum RSVP, entãoperson.attending = None
. Dessa forma, você pode distinguir entre nenhuma informação -None
- e uma resposta negativa.fonte
Eu amo exemplos de código (assim como frutas), então deixe-me mostrar
Nenhum não significa nada, não tem valor.
Nenhum é avaliado como Falso.
fonte
print(None)
impressões ..None
. Ele faz não , como você sugere, imprimir nada.None
se for o resultado da última expressão. (que é principalmente útil para funções não pretende retornar um valor.)None
se esse é o resultado de uma expressão, principalmente para não confundir a saída.fonte