Escreva algumas linhas de código Python,, X
que não fazem referência a nenhuma variável global, como
def method():
X
print(a)
method()
imprime 1
mas
def method():
X
X
print(a)
method()
impressões 2
.
Então, eu odeio ser um defensor, mas parece vars
e locals
são realmente variáveis globais em Python:
def test_global_1():
global vars, locals
vars = lambda: 2
locals = lambda: 3
def test_global_2():
print(vars())
print(locals())
test_global_1()
test_global_2()
Além disso, parece que as pessoas gostariam de ver critérios objetivos de vitória para quebra-cabeças como esse. O tamanho do código não parece muito bom aqui, então talvez possamos criar um sistema de pontos brownie para vários recursos novos do código? Não sei exatamente o que poderia ser, mas aqui está um começo:
- +1 para realmente não globais (nenhum
vars
oulocals
) - +1 por ser o primeiro a publicar uma técnica específica
- +1 para a solução mais curta publicada
- +1 para uma solução que envolve apenas uma única instrução Python
- +1 para "hacks" interessantes, como ingressar em limites lexicais
- +1 por não usar exceções
E se você puder pensar em mais, poderá editar esta pergunta para adicionar à lista.
Esse problema pode ser resolvido sem o uso de exceções e sem o uso de globais como vars
e locals
? Suspeito que sim, embora ainda não tenha descoberto exatamente até agora ...
X
, mas existem outras opções.Respostas:
Inicializa a variável
a
de0
somente se ele já não estiver inicializado na tabela de variáveis. Então, incrementa.Mais brevemente (obrigado ao histocrat por
len
):Se as duas cópias
X
estivessem na mesma linha, poderíamos fazerque dobra para
com o "cordeiro sacrificial"
aa
consumindo a segunda designação de variável.fonte
a=len(vars())+1
Pitão
Pensei nessa solução, desde
try
eexcept
foi a primeira maneira que pensei em determinar se uma variável existia ainda ou não.fonte
Python 2
Basicamente, quando
exec
é encontrado no Python 2, faz com que um sinalizador especial (0x01
) seja removidomethod.func_code.co_flags
, o que faz com que aslocals
atribuições tenham efeito. Eu explorei isso para implementar ononlocal
suporte no Python 2 (consulte a linha 43 para o xor que modifica a flag).fonte
a = locals().get('a', 0) + 1
?exec''
mais;)Minha primeira ideia (e depois misturá-la) foi:
Mas a resposta do histocrata parece ótima.
fonte
Minha tentativa. Usa o módulo matemático para rastrear se o X é executado uma ou duas vezes.
fonte
Editado em resposta ao comentário: a é uma lista de listas vazias de comprimento n, em que n é o número de vezes que você chamou o método. A chamada desse método duas vezes imprime 1 e 2.
fonte
a=[]
como parâmetro está fora dos parâmetros desse desafio.O
try
bloco verifica se a variável a está definida.Se a variável não estiver definida (somente quando o bloco X estiver presente uma vez), a
NameError
exceção será gerada.Se a variável for definida (é quando o bloco X estiver presente duas vezes),
else
será inserida.fonte
else