The "default value" for a function parameter in Python

  1. Здравейте,

    Докато си писах домашното днес, написах нещо което се държи доста странно за мен. Нещото беше нещо такова:

    
    is_happy(a = []):
         print a
         a.append("asd")
    
    is_happy()
    is_happy()
    

    Изход: [] ['asd']

    Отне ми известно време да разбера, че от това ми се чупи програмата. Поразрових се в нета и намерих това:

    The "default value" for a function parameter in Python is instantiated at function declaration time, not every time the function is called. You rarely want to mutate the default value of a parameter, and so it's often a good idea to use something immutable for the default value.

    Може ли някой да ми каже защо това работи така. Освен някаква preformance оптимизация.

    Мерси предварително.

  2. Не съм сигурен но мисля че причината е че ползваш mutable обект.

    http://effbot.org/zone/default-values.htm

    TL;DR : Default parameter values are evaluated when the function definition is executed. This means that the expression is evaluated once, when the function is defined, and that that same “pre-computed” value is used for each call. This is especially important to understand when a default parameter is a mutable object, such as a list or a dictionary: if the function modifies the object (e.g. by appending an item to a list), the default value is in effect modified.

    Моля поправете ме ако греша.

  3. Простия отговор е, че Пайтън оценява стойността по подразбиране(израза за нея) веднъж и си пази получения обект използвайки го винаги, когато се налага. Очевидно с мутируем обект това е малко объркващо и не е много добра идея да се прави ;)

    Edit: всъщност вече е отговорено.

Трябва да сте влезли в системата, за да може да отговаряте на теми.