I need some time figuring out what is behind *args and **kwargs. Finally I understand it, so I want to share it with you here. First of all, you need to know that what you need to understand here is the asterix (*), not the "args" and "kwargs". So if you write f(*params, **oparams) and f(*args, **kwargs), they both will behave similarly. * is used to pass varied length of arguments. Here is an example on how to use * def test_args(a, *b): def test_args(a, *b): print "normal variable: ", a print "first argument: ", b[0] print "second argument: ", b[1] print "third argument: ", b[2] test_args('arwan', 1,2,3,4,5) From the example, "a" is single variable while "b" is varied length of argument. Thus, the first argument will be passed to "a" where the next variable will be passed to "b". Thus, all arguments (1,2,3,4,5) will be passed to "b" ...