|
5222 / 3469 / 1173
Регистрация: 21.03.2016
Сообщений: 8,295
|
|||||||||||
Объясните поведение аргумента в методе19.04.2022, 17:30. Показов 630. Ответов 14
Метки нет (Все метки)
специалисты разжуйте такой вопрос. есть метод класса с аргументом index = [] по умочанию.
Первый вывод [] Второй вывод [0, 1, 2, 3, 4] Первый вывод [0, 1, 2, 3, 4] Второй вывод [0, 1, 2, 3, 4, 0, 1, 2, 3, 4] >>> как видно при втором вызове данные из первого остались в списке. вот и вопрос как и почему? но при таком оформлении
Первый вывод [] Второй вывод [0, 1, 2, 3, 4] Первый вывод [] Второй вывод [0, 1, 2, 3, 4]
0
|
|||||||||||
| 19.04.2022, 17:30 | |
|
Ответы с готовыми решениями:
14
Дефолтное значение аргумента в методе
|
|
712 / 351 / 120
Регистрация: 09.12.2020
Сообщений: 918
|
|||||||||||
| 19.04.2022, 17:53 | |||||||||||
|
Это очень хорошо описано во втором томе книги Лутца, около 27-й главы. Эта переменная находится в "поле класса", это не атрибут экземпляра класса, а атрибут класса. Она сохраняется во время работы программы, не зависит от экземпляров класса и тд. Исходя из этого:
0
|
|||||||||||
|
225 / 15 / 3
Регистрация: 07.04.2022
Сообщений: 74
|
|
| 19.04.2022, 17:58 | |
|
Собственно, я послужил инициатором этого вопроса, но не так хорошо структурированного на форуме для новичков.
И сам попробую на него ответить. Зарылся в документацию. Как я понял, значения аргументов по умолчанию высчитываются, когда функция определяется, а не выполняется. В Питоне объекты по большему счету линкуются. При ссылке на изменяемые mutable объекты при изменении значения аргумента ссылка сохраняется. А вот при присваивания нового значения immutable переменной создается новый объект. При обращении к функции объекты проверяются по id. Если id сменился (а он изменится при изменении аргумента типа immutable), то линкуется объект, созданный, когда функция определялась. Если id не изменился, то линк на него остается. А для изменяемых объектов (list, dict, set, byte arrays) при изменении значения аргумента, как я уже писал, id не меняется. Получается, что значение такого аргумента не откатывается в дефолт. Как-то так...
0
|
|
|
712 / 351 / 120
Регистрация: 09.12.2020
Сообщений: 918
|
||||
| 19.04.2022, 18:08 | ||||
|
Добавлено через 30 секунд Судя по тому, какое серьезное исследование вы тут проводите, я просто не понял суть проблему, поэтому прошу объяснить. Добавлено через 3 минуты если волнует именно разница в поведении двух кодов, которые предложил Semen-Semenich, то тут все не менее очевидно, в 1м варианте
0
|
||||
|
225 / 15 / 3
Регистрация: 07.04.2022
Сообщений: 74
|
||
| 19.04.2022, 18:11 | ||
|
Вопрос именно в том, что в качестве аргумента метода (и функции, кстати, тоже) нельзя использовать изменяемые mutable объекты. Лично для себя я уже понял почему, и в предыдущем посте попробовал это объяснить. Может немного нескладно, я только 20+ дней как изучаю Питон и в терминологии могу путаться. Но для себя я суть и причины понял четко.
0
|
||
|
5222 / 3469 / 1173
Регистрация: 21.03.2016
Сообщений: 8,295
|
|||
| 19.04.2022, 18:17 [ТС] | |||
|
0
|
|||
|
712 / 351 / 120
Регистрация: 09.12.2020
Сообщений: 918
|
||
| 19.04.2022, 18:24 | ||
|
0
|
||
|
243 / 178 / 73
Регистрация: 17.10.2018
Сообщений: 749
|
|
| 19.04.2022, 18:36 | |
|
Уважаемые новички, независимо от того, является ли функция методом класса или независимой функцией, использовать при инициации ее аргументов мутабельные значения - это выстрел себе в ногу. Читаем про ссылки на объекты в памяти. Что происходит когда вы создаете любой мутабельный объект, как ведут себя ссылки на него в последующем и т.п.
0
|
|
|
225 / 15 / 3
Регистрация: 07.04.2022
Сообщений: 74
|
|
| 19.04.2022, 18:42 | |
|
Смотрите. Функция и метод при определении (инициализации) сопоставляет все данные по id объектов самой функции и вызывающей функции и запоминает состояние. При повторном вызове она не инициализируется заново, а возвращает состояние из памяти по id. При этом в Питоне при изменении значения immutable объектов создается новый объект с новым id, а при изменении значения mutable объектов изменяется состояние объекта, а id остается старым.
Когда функция при новом обращении берет свое состояние на момент инициализации из памяти, то для булевого значения (immutable) key = True при изменении на False id будет другим и функция вернет старое id - True. А для списка mutable при любых изменения значения внутри id останется старым именно в силу того, что он mutable. Вот его значение и не вернется к дефолту.
0
|
|
|
5222 / 3469 / 1173
Регистрация: 21.03.2016
Сообщений: 8,295
|
||||||
| 19.04.2022, 18:49 [ТС] | ||||||
|
Viller_dm, интересно. тут даже класс не при чем
Второй вывод [0, 1, 2, 3, 4] Первый вывод [0, 1, 2, 3, 4] Второй вывод [0, 1, 2, 3, 4, 0, 1, 2, 3, 4] я бы еще понял если бы index был объявлен в глобальной области. интересное поведение конечно.
0
|
||||||
|
243 / 178 / 73
Регистрация: 17.10.2018
Сообщений: 749
|
|
| 19.04.2022, 18:50 | |
|
0
|
|
|
225 / 15 / 3
Регистрация: 07.04.2022
Сообщений: 74
|
|
| 19.04.2022, 18:51 | |
|
0
|
|
|
5222 / 3469 / 1173
Регистрация: 21.03.2016
Сообщений: 8,295
|
|
| 19.04.2022, 18:57 [ТС] | |
|
Lekks, читал. про видимость и изменение мутабельных объектов в теле функции знаю. но вот что такой объект в аргументе при повторном вызове функции не создается заново а берется из памяти это для меня новое.
0
|
|
|
225 / 15 / 3
Регистрация: 07.04.2022
Сообщений: 74
|
||
| 19.04.2022, 19:22 | ||
|
0
|
||
|
243 / 178 / 73
Регистрация: 17.10.2018
Сообщений: 749
|
|
| 19.04.2022, 19:28 | |
|
Viller_dm, ну все верно.
0
|
|
| 19.04.2022, 19:28 | |
|
Помогаю со студенческими работами здесь
15
Странное поведение аргумента Объясните что делается в этом методе
Объясните, что происходит в методе initialize, как работает код Объясните поведение интерпритаторы Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
|
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма).
На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
|
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ *
Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам
Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
|
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым.
Но восстановить их можно так.
Для этого понадобится консольная утилита. . .
|
|
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
|
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11
— это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
|
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11
Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
|
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
|