Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.10.2019, 07:33   #1
print_Alex
Пользователь
 
Регистрация: 24.07.2019
Сообщений: 52
Вопрос Повторный список. Python

Почему не был создан новый список при повторном запуске функции?

Код:
def to_buy(*new_items, shopping_list = []):
    for i in new_items:
        shopping_list.append(i)
    return shopping_list
​
monday = to_buy('яблоки', 'молоко', 'хлеб')
print(monday)
​
tuesday = to_buy('груши', 'йогурт', 'мясо')
print(tuesday)

# ['яблоки', 'молоко', 'хлеб']
# ['яблоки', 'молоко', 'хлеб', 'груши', 'йогурт', 'мясо']
print_Alex вне форума Ответить с цитированием
Старый 29.10.2019, 08:33   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Потому что читать надо внимательно книжки. В Python параметры по умолчанию вычисляются один раз.
p51x вне форума Ответить с цитированием
Старый 29.10.2019, 09:22   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

я вообще не знаю Python.
и этот код я не понимаю. (непонятно, где сохраняется shopping_list между вызовами).
но, методом тыка я увидел, что список можно очистить:

Код:
monday = to_buy('яблоки', 'молоко', 'хлеб')
print(monday)

monday.clear()
​
tuesday = to_buy('груши', 'йогурт', 'мясо')
print(tuesday
p51x, прокомментируете?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 29.10.2019, 09:49   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
непонятно, где сохраняется shopping_list между вызовами
я же написал где
https://docs.python.org/3.9/tutorial...rgument-values
Цитата:
Important warning: The default value is evaluated only once. This makes a difference when the default is a mutable object such as a list, dictionary, or instances of most classes. For example, the following function accumulates the arguments passed to it on subsequent calls:

Код:
def f(a, L=[]):
    L.append(a)
    return L

print(f(1))
print(f(2))
print(f(3))
This will print

Код:
[1]
[1, 2]
[1, 2, 3]
If you don’t want the default to be shared between subsequent calls, you can write the function like this instead:

Код:
def f(a, L=None):
    if L is None:
        L = []
    L.append(a)
    return L
p51x вне форума Ответить с цитированием
Старый 29.10.2019, 09:57   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Во-первых, большое спасибо за ответ!!

во-вторых, я понял, о чём Вы написали в пост #2
и поведение программы в точности соответствует документации.
вопрос в другом. где хранится значение списка? Судя по всему, в памяти создаётся экземпляр
Цитата:
Сообщение от p51x Посмотреть сообщение
list, dictionary, or instances of most classes
, который и существует в течение всего жизненного цикла программы.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 29.10.2019, 21:32   #6
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Как я понял, это работает так:
Код:
def to_buy(*new_items, shopping_list = []):
# Значение по умолчанию - это shopping_list = [].
# При этом создаётся объект с пустым значением и
# shopping_list получает ссылку на этот объект.
    for i in new_items:  # объект наполняется значениями
        shopping_list.append(i)
    return shopping_list # возвращается ссылка на объект

# monday получает ссылку на объект
monday = to_buy('яблоки', 'молоко', 'хлеб')
print('1- monday = ', monday)

# При повторном вызове новый объект не создаётся
# В теле функции существующий объект дополняется новыми
# значениями и tuesday получает на него ссылку
tuesday = to_buy('груши', 'йогурт', 'мясо')
print('2- tuesday = ', tuesday)

# Повторный вывод для monday даст последнее значение
print('3- monday = ', monday) # monday == tuesday
print('4- monday is tuesday = ', monday is tuesday)
#
monday.clear()  # Эта операция очистит объект,
                # так как monday - это ссылка на объект
                # Значения для monday и shopping_list будут утрачены
# но после
tuesday = to_buy('груши', 'йогурт', 'мясо')
print('5- monday = ',monday) # Будет выведен список с последними значениями
                             # Поскольку monday всё ещё ссылается на объект
Мне этот пример понравился
Как-то так, ...

Последний раз редактировалось ViktorR; 29.10.2019 в 22:20. Причина: Изменил вывод
ViktorR вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Двунаправленный линейный список на python General_ghest Python 1 10.10.2019 20:36
Задача на список или словарь в Python nata22440 Фриланс 2 23.05.2017 10:46
Повторный запуск программы lev_ Помощь студентам 2 13.12.2014 11:39
Повторный вызов функции из dll Smertnik Общие вопросы C/C++ 5 15.05.2009 22:18