Если ваше единственное требование - объединить несколько элементов в один объект, и этот объект не должен быть изменяемым, используйте кортеж вместо списка. Кортежи обеспечивают одинаковое поведение списков, за исключением изменения их элементов. Точнее, изменяемые элементы все еще могут быть видоизменены, но элементы кортежа не могут быть назначены, добавлены или удалены, и сам кортеж считается неизменной структурой данных. Синтаксис для создания кортежа такой же, как и у списка, только с круглыми скобками вместо квадратных скобок:
# Immutable container with immutable elements, perfectly fine to use as a default argument
tuple_o_fruits = ("Apple", "Banana", "Orange")
Python Отсутствие универсальной c принудительной конст-корректности является одним из немногих вещи, которые действительно раздражают меня о языке. Стандартное решение - использовать встроенные неизменяемые типы данных, такие как tuple
, вместо изменяемых, таких как list
. Например, неизменной формой set
является frozenset
. Многие распространенные встроенные типы, такие как str
, int
и float
, доступны только в неизменяемом виде. bytes
- интересный случай, потому что неизменяемая форма более известна, чем ее изменяемая альтернатива bytearray
. Самым выдающимся встроенным изменяемым типом, в котором отсутствует неизменная альтернатива, является dict
(, но не сложно создать собственный ).
Итак, реальный ответ на вопрос «как избежать предупреждений?» об изменяемых аргументах по умолчанию ", 9 раз из 10, чтобы не использовать изменяемый объект, потому что неизменяемые альтернативы, как правило, легко доступны. Этого должно быть достаточно для вашего случая.