Изменяемые объекты и функции Python.

Мы знаем, что все в Python является объектом и может быть классифицировано как изменяемое и неизменяемое, где изменяемый объект — это объект, состояние которого может измениться после построения, а последний — объект, состояние которого не может быть изменено после построения.

фрагмент кода, сделанный красиво

И Dictionary, и List в python являются изменяемыми, поэтому следует соблюдать осторожность при передаче в качестве аргумента функциям, поскольку они передаются по ссылке, а не по значению, а это означает, что при передаче функции в качестве аргумента на объект ссылается и копия объект не создается, что может вызвать ошибку в зависимости от того, чего вы пытаетесь достичь с помощью своего кода.

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

фрагмент кода, сделанный красиво

В этом фрагменте кода выше у меня есть переменная «таблица_лидеров» который ссылается на объект словаря, который содержит данные о рейтинге таблицы лидеров, также есть функция, которая добавляет нового члена в мою таблицу лидеров, функция «добавить_нового_члена» принимает объект словаря LeaderBoard, имя нового члена и счет, когда эта функция вызывается и передается в «таблица_лидеров» объект, имя нового члена («Джанет») и оценка (12).

доска_лидеров[name] = оценка

Это состояние выше в функции добавляет новые данные пары ключ: значение к объекту таблицы лидеров в памяти.

когда функция «добавить_нового_члена» называется ссылкой на объект Leader_board в памяти и изменяет значение на месте, когда Leader_board печатается внутри функции, которую мы получаем.

{‘Джеймс’: 23, ‘Доу’: 20, ‘с’: 15, ‘Джанет’: 12}

Также, когда объект Leader_board распечатывается вне функции, мы получаем тот же результат. Чтобы убедиться в этом, давайте запустим тест объекта, обновив код, чтобы вернуть таблицу лидеров из функции и использовать «является» оператор для проверки объекта.

фрагмент кода, сделанный красиво

печать (результат — таблица лидеров)

Этот приведенный выше оператор вернет True, потому что «является» Оператор проверяет, ссылаются ли два операнда, т.е. результат и таблица лидеров, на один и тот же объект и имеют ли они одинаковое значение.

Я также добавил новый блок кода ниже в кодовую базу, чтобы показать, что «является» оператор на самом деле делает то, что он делает «печать (таблица_лидеров — это доска_лидеров_2)» вернет False, потому что это два разных объекта в памяти, даже если у них одинаковые данные, они должны ссылаться на один и тот же объект.

Переопределение вселенной

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

фрагмент кода, сделанный красиво

С новой обновленной кодовой базой, приведенной выше, теперь используется «копировать» метод с изменяемым объектом, вернуть неглубокую копию данных и создать новый объект в памяти, и вы можете видеть, что наш «результат» объект отличается от «таблица_лидеров» объект, когда мы делаем объектный тест «печать (результат — таблица лидеров)» мы получаем False, чтобы показать, что это не один и тот же объект в памяти.

Примечание: вся история выше применима и к объекту List, он также изменчив.

Вывод

Таким образом, в зависимости от того, чего вы пытаетесь достичь с помощью своего кода, знайте, когда на самом деле использовать изменяемый объект, передаваемый по ссылке, а когда переопределить поведение else 😢 🐛 🐛 😢.

Не забудьте поделиться этим со своими коллегами-питонистами, вы можете спасти душу.

Спасибо.

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *