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