Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 Аватар для Semen-Semenich
5222 / 3469 / 1173
Регистрация: 21.03.2016
Сообщений: 8,295

Объясните поведение аргумента в методе

19.04.2022, 17:30. Показов 630. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
специалисты разжуйте такой вопрос. есть метод класса с аргументом index = [] по умочанию.
Python
1
2
3
4
5
6
7
8
9
10
11
class Test:
        
    def del_couple(self, index = []):
        print(f'Первый вывод {index}')
        for x in range(5):
            index.append(x)
        print(f'Второй вывод {index}')
 
res = Test()
res.del_couple()
res.del_couple()
по моей логике при каждом вызове метода список должен быть пустым но упс.
Первый вывод []
Второй вывод [0, 1, 2, 3, 4]
Первый вывод [0, 1, 2, 3, 4]
Второй вывод [0, 1, 2, 3, 4, 0, 1, 2, 3, 4]
>>>
как видно при втором вызове данные из первого остались в списке. вот и вопрос как и почему?
но при таком оформлении

Python
1
2
3
4
5
6
7
8
9
10
11
12
class Test:
        
    def del_couple(self):
        index = []
        print(f'Первый вывод {index}')
        for x in range(5):
            index.append(x)
        print(f'Второй вывод {index}')
 
res = Test()
res.del_couple()
res.del_couple()
список обнуляется

Первый вывод []
Второй вывод [0, 1, 2, 3, 4]
Первый вывод []
Второй вывод [0, 1, 2, 3, 4]
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.04.2022, 17:30
Ответы с готовыми решениями:

Дефолтное значение аргумента в методе
Вообщем есть метод, в нем 10 параметров, и 4(конечных) с дефолтными значениями, мне нужно забить первых 6 потом два оставить их дефолтное...

Правильно ли я понимаю значения аргумента в моем методе?
Тип работаю с класами, задали дз сделать клас по примеру. В примере неясный один момент: void setID(char* id) { ID=id; } ...

Ошибка при добавлении аргумента startline в методе Find
Здравствуйте, есть в коде: Dim count As Long Set rFind = Columns("A").Find(What:=name, LookIn:=xlValues, _ ...

14
712 / 351 / 120
Регистрация: 09.12.2020
Сообщений: 918
19.04.2022, 17:53
Это очень хорошо описано во втором томе книги Лутца, около 27-й главы. Эта переменная находится в "поле класса", это не атрибут экземпляра класса, а атрибут класса. Она сохраняется во время работы программы, не зависит от экземпляров класса и тд. Исходя из этого:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Test:
 
    def del_couple(self, index=[]):
        print(f'Первый вывод {index}')
        for x in range(5):
            index.append(x)
        print(f'Второй вывод {index}')
 
 
res = Test()
res.del_couple()
res.del_couple()
res2 = Test()
res2.del_couple()
Code
1
2
3
4
5
6
7
8
Первый вывод []
Второй вывод [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, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4]
 
Process finished with exit code 0
- то есть мы создаем еще один экземпляр этого класса, но от этого никак не зависит переменные, находящиеся в поле класса
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
Цитата Сообщение от Viller_dm Посмотреть сообщение
При ссылке на изменяемые mutable объекты при изменении значения аргумента ссылка сохраняется. А вот при присваивания нового значения immutable переменной создается новый объект. При обращении к функции объекты проверяются по id. Если id сменился (а он изменится при изменении аргумента типа immutable), то линкуется объект, созданный, когда функция определялась. Если id не изменился, то линк на него остается. А для изменяемых объектов (list, dict, set, byte arrays) при изменении значения аргумента, как я уже писал, id не меняется. Получается, что значение такого аргумента не откатывается в дефолт.
подтверждаю, но туда ли вы роете? Разве это связано с атрибутами класса, атрибутами его экземпляров? То что вы задаете class.attribute и он остается прежним при использовании этого класса (именно то, о чем спросил Semen-Semenich, как я понял), то в этом ничего сверхъестественного нет, все работает так, как должно работать, ответ на это на поверхности.

Добавлено через 30 секунд
Судя по тому, какое серьезное исследование вы тут проводите, я просто не понял суть проблему, поэтому прошу объяснить.

Добавлено через 3 минуты
если волнует именно разница в поведении двух кодов, которые предложил Semen-Semenich, то тут все не менее очевидно, в 1м варианте
Цитата Сообщение от Semen-Semenich Посмотреть сообщение
def del_couple(self, index = []):
при повторном вызове метода del_couple переменная index уже существует в поле класса, заново она не создается. Во втором же примере
Цитата Сообщение от Semen-Semenich Посмотреть сообщение
def del_couple(self):
        index = []
она, естественно, создается заново
0
225 / 15 / 3
Регистрация: 07.04.2022
Сообщений: 74
19.04.2022, 18:11
Цитата Сообщение от alilxxey Посмотреть сообщение
Судя по тому, какое серьезное исследование вы тут проводите, я просто не понял суть проблему, поэтому прошу объяснить.
Если вы об атрибуте экземпляра класса в теме инициаторе, то там моя банальная невнимательность.
Вопрос именно в том, что в качестве аргумента метода (и функции, кстати, тоже) нельзя использовать изменяемые mutable объекты. Лично для себя я уже понял почему, и в предыдущем посте попробовал это объяснить. Может немного нескладно, я только 20+ дней как изучаю Питон и в терминологии могу путаться. Но для себя я суть и причины понял четко.
0
 Аватар для Semen-Semenich
5222 / 3469 / 1173
Регистрация: 21.03.2016
Сообщений: 8,295
19.04.2022, 18:17  [ТС]
Цитата Сообщение от alilxxey Посмотреть сообщение
при повторном вызове метода del_couple переменная index уже существует в поле класса
вот теперь более менее все проясняется но как то мутно
Цитата Сообщение от alilxxey Посмотреть сообщение
это не атрибут экземпляра класса, а атрибут класса
метод атрибут класса но аргумент по умолчанию в нем как относится к классу вот в чем непонятка. пойду читать лутца.
0
712 / 351 / 120
Регистрация: 09.12.2020
Сообщений: 918
19.04.2022, 18:24
Цитата Сообщение от Semen-Semenich Посмотреть сообщение
но аргумент по умолчанию в нем как относится к классу вот в чем непонятка
Как уже сказал Viller_dm, при определении аргумента по умолчанию, функция/метод проверяет, есть ли в ее поле переменных переменная с этим названием. В случае mutable переменной index, она уже существует как атрибут класса, соответственно значение по умолчанию ей присваивать не надо.
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
 Аватар для Semen-Semenich
5222 / 3469 / 1173
Регистрация: 21.03.2016
Сообщений: 8,295
19.04.2022, 18:49  [ТС]
Viller_dm, интересно. тут даже класс не при чем
Python
1
2
3
4
5
6
7
8
9
def del_couple(index=[]):
    print(f'Первый вывод {index}')
    for x in range(5):
        index.append(x)
    print(f'Второй вывод {index}')
    
 
del_couple()
del_couple()
Первый вывод []
Второй вывод [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
Цитата Сообщение от Semen-Semenich Посмотреть сообщение
я бы еще понял если бы index был объявлен в глобальной области. интересное поведение конечно
Читаем мой пост выше ))))
0
225 / 15 / 3
Регистрация: 07.04.2022
Сообщений: 74
19.04.2022, 18:51
Цитата Сообщение от Semen-Semenich Посмотреть сообщение
я бы еще понял если бы index был объявлен в глобальной области. интересное поведение конечно.
По большему счету причины тут на более низком уровне - на структурном.
0
 Аватар для Semen-Semenich
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
Цитата Сообщение от Semen-Semenich Посмотреть сообщение
Lekks, читал. про видимость и изменение мутабельных объектов в теле функции знаю. но вот что такой объект в аргументе при повторном вызове функции не создается заново а берется из памяти это для меня новое.
Так это же аргумент по умолчанию. Если функция определена, то для него создан объект он хранится в памяти, как и для всех других аргументов. А вот прописанный в теле функции объект index = [] при возврате результата в вызывающую функцию, удаляется.
0
243 / 178 / 73
Регистрация: 17.10.2018
Сообщений: 749
19.04.2022, 19:28
Viller_dm, ну все верно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.04.2022, 19:28
Помогаю со студенческими работами здесь

Странное поведение аргумента
Есть код: Set Http = WScript.CreateObject("MSXML2.ServerXMLHTTP.6.0") Http.setProxy 2, "РабочийПрокся", "" Http.Open...

Объясните что делается в этом методе
пожалуйста может кто объясните что делается в этом методе заранее спс) public static int Get(int array) { ...

Объясните где ошибаюсь в методе Гаусса?
Не могу вспомнить как решать метод Гаусса, в примере насколько я помню (а это не точно) неизвестные не должны быть дробными частями....

Объясните, что происходит в методе initialize, как работает код
private void initialize(){ tiles = new ArrayList(width); for (int i = 0; i < width; i++){ tiles.add(i, new...

Объясните поведение интерпритаторы
Есть списк чисел представленных как строки (на пример a=), если функцие max в качестве аргумента передать такой списко, она почему-то...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
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
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru