Почему значения по умолчанию разделяются между объектами
Часто ожидается, что вызов функции создаёт новые объекты для значений по умолчанию. Но это не так. Значения по умолчанию создаются лишь однажды, когда функция определяется. Если этот объект изменяется, как словарь в нашем примере, последующие вызовы функции будут использовать изменённый объект.
По определению, неизменяемые объекты (числа, строки, кортежи и None), безопасны при изменении. Изменение изменяемых объектов, таких как словари, списки, и экземпляры пользовательских классов может привести к неожиданным последствиям.
Часто ожидается, что вызов функции создаёт новые объекты для значений по умолчанию. Но это не так. Значения по умолчанию создаются лишь однажды, когда функция определяется. Если этот объект изменяется, как словарь в нашем примере, последующие вызовы функции будут использовать изменённый объект.
По определению, неизменяемые объекты (числа, строки, кортежи и None), безопасны при изменении. Изменение изменяемых объектов, таких как словари, списки, и экземпляры пользовательских классов может привести к неожиданным последствиям.
Как передать опциональные или именованные параметры из одной функции в другую
Получить такие параметры можно с помощью спецификаторов * и в списке аргументов функции; они возвращают кортеж позиционных аргументов и словарь именованых параметров. После этого Вы можете передать их в другую функцию, используя в её вызове * и
Получить такие параметры можно с помощью спецификаторов * и в списке аргументов функции; они возвращают кортеж позиционных аргументов и словарь именованых параметров. После этого Вы можете передать их в другую функцию, используя в её вызове * и
Как создавать функции более высокого порядка
Есть два пути: использовать вложенные функции или вызываемые объекты.
Использование вызываемого объекта - немного медленнее, и в результате получается больше кода. Однако, заметьте, что несколько функций могут разделять свою сигнатуру с помощью наследования.
Объект может сохранять свое состояние для нескольких вызовов.
Есть два пути: использовать вложенные функции или вызываемые объекты.
Использование вызываемого объекта - немного медленнее, и в результате получается больше кода. Однако, заметьте, что несколько функций могут разделять свою сигнатуру с помощью наследования.
Объект может сохранять свое состояние для нескольких вызовов.
Почему изменение списка 'y' изменяет также список 'x'
Вы, возможно, будете удивлены тому, что добавление в
Два факта приводят к такому результату:
• Переменные - это просто ссылки на объекты.
• Списки изменяемы.
Вы, возможно, будете удивлены тому, что добавление в
y
изменяет также и x
.Два факта приводят к такому результату:
• Переменные - это просто ссылки на объекты.
y = x
не создаёт копию списка - это просто создаёт переменную y
, которая ссылается на тот же объект, что и x
.• Списки изменяемы.
Как можно узнать имя объекта
Вообще говоря, никак, поскольку объекты в действительности не имеют имён. Важно: присваивание всегда связывает имя с объектом. Это верно и для инструкций
Возможно, класс имеет имя: однако, хотя он связан с двумя именами и запрашивается через имя
Вообще говоря, никак, поскольку объекты в действительности не имеют имён. Важно: присваивание всегда связывает имя с объектом. Это верно и для инструкций
def
и class
.Возможно, класс имеет имя: однако, хотя он связан с двумя именами и запрашивается через имя
B
, созданный экземпляр всё ещё считается экземпляром класса A
. Однако, невозможно сказать, имя экземпляра a
или b
, поскольку оба они связаны с одним и тем же значением.Какой приоритет у оператора "запятая"
Запятая не является оператором в Python. Поскольку запятая - не оператор, но разделитель между выражениями, если бы было введено:
Запятая не является оператором в Python. Поскольку запятая - не оператор, но разделитель между выражениями, если бы было введено:
("a"
in "b"), "a"
А не"a"
in ("b", "a")
То же самое верно и для операторов присваивания (=
, +=
и другие). Они не являются операторами как таковыми, а лишь синтаксическими разделителями в операциях присваивания.Как использовать строки для вызова функций/методов
Существует несколько приёмов.
Лучший - использование словаря, ставящего соответствие строке функцию. Его главное достоинство - строки не обязаны совпадать с названиями функций. Использование встроенной функции getattr. И использование locals или eval (не рекомендуется).
Существует несколько приёмов.
Лучший - использование словаря, ставящего соответствие строке функцию. Его главное достоинство - строки не обязаны совпадать с названиями функций. Использование встроенной функции getattr. И использование locals или eval (не рекомендуется).
Проверка принадлежности элемента данной коллекции c помощью оператора in
x in s — вернет True, если элемент входит в коллекцию s и False — если не входит
Есть и вариант проверки не принадлежности: x not in s, где есть по сути, просто добавляется отрицание перед булевым значением предыдущего выражения.
x in s — вернет True, если элемент входит в коллекцию s и False — если не входит
Есть и вариант проверки не принадлежности: x not in s, где есть по сути, просто добавляется отрицание перед булевым значением предыдущего выражения.