Пустой словарь как значение по умолчанию для аргумента ключевого слова в функции 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 равно reset по три на каждый вызов.

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

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

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

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

Это поведение видно из 2.5, 2.6 и 3.1.

Ответ 1

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