Напишите несколько строк кода Python X
, который не ссылается ни на какие глобальные переменные, например
def method():
X
print(a)
method()
печатает 1
но
def method():
X
X
print(a)
method()
отпечатки 2
.
Таким образом, я не хочу быть приверженцем, но, похоже , vars
и locals
на самом деле глобальные переменные в 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()
Кроме того, похоже, что люди хотели бы видеть объективные критерии победы для подобных головоломок. Длина кода здесь не совсем подходит, так что, может быть, мы могли бы создать систему коричневых очков для различных новых функций кода? Я не уверен, что именно это может быть, но вот начало:
- +1 для действительно действительно нет глобальных (нет
vars
илиlocals
) - +1 за то, что первым опубликовал конкретную технику
- +1 за самое короткое опубликованное решение
- +1 за решение, включающее только одну инструкцию Python
- +1 за интересные "хаки", такие как присоединение к лексическим границам
- +1 за неиспользование исключений
И если вы можете думать больше, вы можете отредактировать этот вопрос, чтобы добавить в список.
Можно ли решить эту проблему, не используя исключения и не используя глобальные переменные типа vars
и locals
? Я подозреваю, что это возможно, хотя я еще не выяснил, как именно ...
X
, но есть и другие варианты.Ответы:
Инициализировать переменную
a
для0
только если он не инициализирован в таблице переменных. Затем увеличивает его.Короче (спасибо гистократу за
len
):Если две копии
X
могут быть на одной строке, мы могли бы сделатькоторый удваивается
с «жертвенным ягненком»,
aa
поедающим второе переменное назначение.источник
a=len(vars())+1
питон
Мысль об этом решении, так как я
try
иexcept
был первым способом определить, существует ли переменная или нет.источник
Python 2
В основном, когда
exec
встречается в Python 2, это вызывает специальный флаг (0x01
удаление )method.func_code.co_flags
, что даетlocals
эффект назначениям. Я использовал это для реализацииnonlocal
поддержки в Python 2 (см. Строку 43 для xor, который изменяет флаг).источник
a = locals().get('a', 0) + 1
?exec''
;)Моей первой идеей (а потом обмахиваясь этим) было:
Но ответ гистократа кажется оптимальным.
источник
Моя попытка. Использует математический модуль для отслеживания, запускается ли X один или два раза.
источник
Отредактировано в ответ на комментарий: a - это список пустых списков длиной n, где n - количество раз, которое вы вызвали методом. Вызов этого метода дважды выводит 1, затем 2.
источник
a=[]
в качестве параметра находится за пределами параметров для этой задачи.В
try
проверяет блок , если переменная а определена.Если переменная не определена, (это происходит только тогда, когда X-блок присутствует один раз), то
NameError
возникает исключение.Если переменная определена, (это когда X-блок присутствует дважды), то
else
будет введен.источник
else