2013-02-11 2 views
0

Я открыл свой интерпретатор python, закодировал и выполнил следующую функцию.Почему моя функция продолжает возвращать более длинный список?

>>> def crazy_function(my_list=[]): 
...  my_list.append(0) 
...  return my_list 
... 
>>> crazy_function() 
[0] 
>>> crazy_function() 
[0, 0] 
>>> crazy_function() 
[0, 0, 0] 
>>> crazy_function() 
[0, 0, 0, 0] 
>>> crazy_function() 
[0, 0, 0, 0, 0] 
>>> crazy_function() 
[0, 0, 0, 0, 0, 0] 
>>> crazy_function() 
[0, 0, 0, 0, 0, 0, 0] 
>>> 

Что происходит? Почему список, возвращаемый функцией, продолжает увеличиваться, чем больше я вызываю функцию? Разве не следует создавать новый локальный список при каждом вызове функции?

+0

питона создание: D – dangerChihuahua007

+4

Это спрашивает много - см [ «изумление» Наималейшее в Python: Мутабельный аргумент по умолчанию] (http://stackoverflow.com/questions/1132941/least-astonishment-in-python -the-mutable-default-argument) –

+0

Эти вопросы всегда закрываются * SO FAST *. Это впечатляет. – mgilson

ответ

2

Общей ошибкой является назначение изменяемых объектов значению по умолчанию для аргумента функции. Цитируя documentation: значения параметров

по умолчанию вычисляются при определении функции выполняется. Это означает, что выражение оценивается один раз, когда определена функция и что для каждого вызова используется то же самое «предварительно вычисленное» значение . Это особенно важно для понимания, когда параметр по умолчанию является изменяемым объектом, таким как список или словарь: , если функция изменяет объект (например, добавив элемент в список ), значение по умолчанию изменено , Обычно это не .

Смежные вопросы