arguments are passed by automatically assigning objects to local variable names: function arguments are just
python assignment at work. because references are implemented as pointers, all arguments are in effect , passed
by pointers. objects passed as arguments are never automatically copied
assigning to argument names inside a function does not affect the caller.
changing a mutable object argument in a function may impact the caller.
Immutable arguments are effectively passed "by value" and "mutable arguments" are passed "by pointer".
to mimick passing by value for mutable arguments, we can do
def changer(a,b):
b=b[:] # copy list, so we do not impact calller
or changer(a, tuple(L)) # pass a tuple, os changes are errors
tools are match arguments:
1. Positionals: matched from left to right
2. Keywords: matched by argument name:
3. Defaults: specify values for optional arguments that aren't passed
4. varargs collecting: collecting arbitrarily many positional or keyword arguments: functions canuse special arguments preceded with one or two * characters to collect an arbitrary number of possibly extra arguments.
5. varargs unpacking: pass arbitrarily many positional or keyword arguments
examples:
func(value)
func(name=value)
func(*iterable)
func(**dict) # pass key/value pair
def func(name)
def func(name=value)
def func(*name)
def fund(**name)
def func(*other, name)
def func(*, name=value)