Теперь после моей серии "вопросов о новинках python" и на основе другого вопроса.
Prerogative
Перейдите в http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html#other-languages-have-variables и прокрутите вниз до "Значения параметров по умолчанию". Там вы можете найти следующее:
def bad_append(new_item, a_list=[]):
a_list.append(new_item)
return a_list
def good_append(new_item, a_list=None):
if a_list is None:
a_list = []
a_list.append(new_item)
return a_list
Там даже "Важное предупреждение" на python.org с этим же примером, на самом деле не говорит "лучше".
Один из способов поставить
Итак, вопрос здесь: почему "хороший" синтаксис по известной проблеме уродливый, как на языке программирования, который способствует "элегантному синтаксису" и "легкий в использовании" ?
изменить
Другой способ поставить
Я не спрашиваю почему и как это происходит (спасибо Mark за ссылку).
Я спрашиваю почему нет более простой альтернативы, встроенной в язык.
Я думаю, что лучший способ, вероятно, мог бы сделать что-то в самом def
, в котором аргумент name будет привязан к "локальному" или "новому" внутри изменяемого объекта def
. Что-то вроде:
def better_append(new_item, a_list=immutable([])):
a_list.append(new_item)
return a_list
Я уверен, что кто-то может прийти с лучшим синтаксисом, но я также предполагаю, что должно быть очень хорошее объяснение, почему это не было сделано.