пустой словарь как значение по умолчанию для аргумента ключевого слова в функции 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 должно быть установлено значение по умолчанию {} . Но, как вы можете видеть, d устанавливается в словарь, на который d указывал в предыдущем вызове.

Что происходит?

Является ли литерал {} в строке def в строке охватывающая область?

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

26
задан A J 9 October 2016 в 04:06
поделиться