This is a well known python gotcha
Basically, the default for that argument is created when the method is first defined, and since it is a mutable object (in this case, a list), it just referes to the same object even after it has changed, and even in subsequent calls to the method.
The usual way to deal with cases like that is to treat it like in your second example:
def __init__(self,argument=None):
self.arguments = arguments or []
But if what you want to do is have a list with all your arguments you could just use Python's argument unpacking.
It works like this:
def my_function(*args):
print args
then, you will have in your method access to a tuple with all the arguments passed. So if you called your function like this:
>>> my_function(1, 2, 3)
your output would be:
(1, 2, 3)
The cool thing is, you can always use it in the oposite way, so, lets suppose you have a list (or tuple), and you want to pass every item in the list as a positional argument to your function. You would do this:
>>> my_list = [1, 2, 3]
>>> my_function(*my_list)
And, as far as your function is concerned, it is the same as the previous call.
You should read the documentation that I pointed to, as well as the section that goes a little more deeply on defining functions.