Страницы

Поиск по вопросам

пятница, 31 января 2020 г.

Необычное поведение области видимости: изменяемый аргумент по умолчанию [дубликат]

#python #область_видимости


        
             
                
                    
                        
                            На этот вопрос уже дан ответ здесь:
                            
                        
                    
                
                        
                            python mutable default параметры [дубликат]
                                
                                    (1 ответ)
                                
                        
                                Закрыт 2 года назад.
            
                    
Столкнулся с одной особенностью Python'а не могу найти материал по этой теме, подскажите
почему так происходит 

def foo(lst = []):
    lst.append(1)

    return lst

foo()
foo()
lst = foo()

print(lst)


Вывод

[1, 1, 1]

    


Ответы

Ответ 1



Инициализация аргументов по-умолчанию происходит 1 раз - до вызова функции. lst = [] - тут создается список, который используется для всех последующих вызовов функции, т.е. вызывая функцию без аргумента, вы всегда работаете с одним и тем же объектом. l = foo() k = foo() id(l) == id(k) # True l is k # True

Ответ 2



Из-за того, что в Python аргументы с значением по умолчанию вычисляются единожды в момент объявления функции, для примера с изменяемыми объектами (например, контейнерами типа list, dict, set, и т.п.) нужно так оформлять: def foo(lst=None): if lst is None: lst = [] lst.append(1) return lst foo() foo() lst = foo() print(lst) # [1] my_list = [0] lst = foo(my_list) print(lst) # [0, 1] Такая фигня не коснется неизменяемых объектов (типа чисел, строк и т.п.), так что смело можно их использовать: def foo(lst=None, value=1): if lst is None: lst = list() lst.append(value) return lst

Ответ 3



в Python аргументы по умолчанию вычисляются единожды в момент объявления функции,а не при вызове функции( как например это сделано в руби)

Комментариев нет:

Отправить комментарий