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