Это хорошо известный питон гоча .
По сути, значение по умолчанию для этого аргумента создается при первом определении метода, и, поскольку он является изменяемым объектом (в данном случае списком), он просто ссылается на тот же объект даже после его изменения, и даже при последующих вызовах метода.
Обычный способ иметь дело с подобными случаями - это обращаться с ним, как во втором примере:
def __init__(self, arguments=None):
self.arguments = arguments or []
Но если вам нужно иметь список со всеми вашими аргументами, вы можете просто использовать аргумент Python для распаковки .
Работает так:
def my_function(*args):
print args
тогда в вашем методе будет доступ к кортежу со всеми переданными аргументами. Так что, если вы назвали свою функцию так:
>>> my_function(1, 2, 3)
Ваш вывод будет выглядеть так:
(1, 2, 3)
Круто то, что вы всегда можете использовать его противоположным образом, поэтому предположим, что у вас есть список (или кортеж), и вы хотите передать каждый элемент списка в качестве позиционного аргумента своей функции. Вы бы сделали это:
>>> my_list = [1, 2, 3]
>>> my_function(*my_list)
И, что касается вашей функции, она такая же, как и предыдущий вызов.
Вы должны прочитать документацию , на которую я указал , а также раздел, в котором более подробно рассматриваются определения функций .