Изменяемые объекты и функции Python.
Мы знаем, что все в Python является объектом и может быть классифицировано как изменяемое и неизменяемое, где изменяемый объект — это объект, состояние которого может измениться после построения, а последний — объект, состояние которого не может быть изменено после построения.
фрагмент кода, сделанный красиво
И Dictionary, и List в python являются изменяемыми, поэтому следует соблюдать осторожность при передаче в качестве аргумента функциям, поскольку они передаются по ссылке, а не по значению, а это означает, что при передаче функции в качестве аргумента на объект ссылается и копия объект не создается, что может вызвать ошибку в зависимости от того, чего вы пытаетесь достичь с помощью своего кода.
Вот фрагмент кода, чтобы понять, что происходит, когда вы передаете изменяемый объект функции.
фрагмент кода, сделанный красиво
В этом фрагменте кода выше у меня есть переменная «таблица_лидеров» который ссылается на объект словаря, который содержит данные о рейтинге таблицы лидеров, также есть функция, которая добавляет нового члена в мою таблицу лидеров, функция «добавить_нового_члена» принимает объект словаря LeaderBoard, имя нового члена и счет, когда эта функция вызывается и передается в «таблица_лидеров» объект, имя нового члена («Джанет») и оценка (12).
доска_лидеров[name] = оценка
Это состояние выше в функции добавляет новые данные пары ключ: значение к объекту таблицы лидеров в памяти.
когда функция «добавить_нового_члена» называется ссылкой на объект Leader_board в памяти и изменяет значение на месте, когда Leader_board печатается внутри функции, которую мы получаем.
{‘Джеймс’: 23, ‘Доу’: 20, ‘с’: 15, ‘Джанет’: 12}
Также, когда объект Leader_board распечатывается вне функции, мы получаем тот же результат. Чтобы убедиться в этом, давайте запустим тест объекта, обновив код, чтобы вернуть таблицу лидеров из функции и использовать «является» оператор для проверки объекта.
фрагмент кода, сделанный красиво
печать (результат — таблица лидеров)
Этот приведенный выше оператор вернет True, потому что «является» Оператор проверяет, ссылаются ли два операнда, т.е. результат и таблица лидеров, на один и тот же объект и имеют ли они одинаковое значение.
Я также добавил новый блок кода ниже в кодовую базу, чтобы показать, что «является» оператор на самом деле делает то, что он делает «печать (таблица_лидеров — это доска_лидеров_2)» вернет False, потому что это два разных объекта в памяти, даже если у них одинаковые данные, они должны ссылаться на один и тот же объект.
Переопределение вселенной
Изменяемый объект, передаваемый по ссылке в функцию, может быть полезен в обязательных случаях, но что, если это не то, как я хочу, чтобы мой код вел себя, что, если я хочу, чтобы мой код принимал изменяемый объект и возвращал новый, не влияя на результат один переданный ему, решение состоит в том, чтобы использовать «копировать ()» метод, предоставляемый изменяемыми объектами, функция копирования возвращает поверхностную копию объекта, которую можно присвоить другой переменной.
фрагмент кода, сделанный красиво
С новой обновленной кодовой базой, приведенной выше, теперь используется «копировать» метод с изменяемым объектом, вернуть неглубокую копию данных и создать новый объект в памяти, и вы можете видеть, что наш «результат» объект отличается от «таблица_лидеров» объект, когда мы делаем объектный тест «печать (результат — таблица лидеров)» мы получаем False, чтобы показать, что это не один и тот же объект в памяти.
Примечание: вся история выше применима и к объекту List, он также изменчив.
Вывод
Таким образом, в зависимости от того, чего вы пытаетесь достичь с помощью своего кода, знайте, когда на самом деле использовать изменяемый объект, передаваемый по ссылке, а когда переопределить поведение else 😢 🐛 🐛 😢.
Не забудьте поделиться этим со своими коллегами-питонистами, вы можете спасти душу.
Спасибо.