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

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

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

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

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

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

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

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

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

Является ли literal {} в строке def в области приложения?

Такое поведение видно из 2.5, 2.6 и 3.1.

One Solution collect form web for “пустой словарь как значение по умолчанию для аргумента ключевого слова в функции python: словарь, кажется, не инициализируется {} при последующих вызовах?”

 >>> 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}) >>> 
Interesting Posts

kivy с ошибкой импорта pycharm

Выберите имена файлов автоматически на основе расчета, а затем импортируйте их в python

SQLAlchemy – выполнение массового upsert (если существует, обновление, else insert) в postgresql

Как я могу указать базу данных для использования тестов Django, а не создавать ее каждый раз?

Python threading.thread.start () не возвращает управление основной теме

Результат функции сохранения в переменную

Использование класса в качестве типа подсказки для аргументов в его методах

ValueError: неверная строка при использовании ast.literal_eval

Как распиливать объект класса B (имеющий много переменных), который наследует от A, который определяет __setstate__ и __getstate__

Получение фактического используемого (выделенного) дискового пространства экземпляра в vmware с pyvmomi

Очистить экран в оболочке

Почему основные исполняемые сценарии Python не скомпилированы в файлы pyc, такие как модули?

Есть ли способ ссылаться на текущую функцию в python?

Что делает унарный оператор ~ в numpy?

Pandas "diff ()" со строкой

Python - лучший язык программирования в мире.