пустой словарь в качестве значения по умолчанию для аргумента ключевого слова в функции Python: похоже, словарь не инициализируется значением {} при последующих вызовах?

Вот функция. Я намерен использовать значения по умолчанию для аргументов ключевого слова, чтобы словарь был пустым, если он не указан.

>>> def f( i, d={}, x=3 ) :
...     d[i] = i*i
...     x += i
...     return x, d
... 
>>> f( 2 )
(5, {2: 4})

Но когда я в следующий раз позвоню f, я получу:

>>> f(3)
(6, {2: 4, 3: 9})

Похоже, что аргумент ключевого слова d при втором вызове указывает не на пустой словарь, а скорее на словарь, который был оставлен в конце предыдущего вызова. Число x сбрасывается до трех при каждом вызове.

Теперь я могу обойти это, но мне бы хотелось, чтобы вы помогли разобраться в этом. Я полагал, что аргументы ключевого слова находятся в локальной области видимости функции и будут удалены, как только функция вернется. (Извините и исправьте мою терминологию, если я неточен.)

Таким образом, локальное значение, на которое указывает имя d, должно быть удалено, и при следующем вызове, если я не предоставлю аргумент ключевого слова d, тогда d должно быть установлено в default {}. Но, как вы можете видеть, d устанавливается в словарь, на который d указывал в предыдущем вызове.

Что здесь происходит?

Находится ли literal {} в строке def охватывающей области?

Такое поведение наблюдается в 2.5, 2.6 и 3.1.


person Andrej Panjkov    schedule 19.04.2011    source источник
comment
Это типичная ошибка Python: изменяемые значения по умолчанию для аргументов функции / метода   -  person Ocaso Protal    schedule 19.04.2011


Ответы (1)


person    schedule
comment
мы можем определить его как d = d или {}. - person Program Questions; 21.10.2016
comment
@ProgramQuestions, если d - пустой диктант, это может не делать того, что вы хотите. - person Stuart Axon; 07.10.2019