1. 可变类型作为参数
可变对象: list/set/dict
参数会指向可变对象的副本的地址,每次修改的是同一个对象。
def flist(l):l.append(0)print(l)ll = []
flist(ll)
flist(ll)
输出为:
 [0]
 [0, 0]
# 注意:l只是ll的一个副本,修改l不会改变ll的值
def clear_list(l):l = []ll = [1,2,3]
clear_list(ll)
print(ll)
输出为:
 [1, 2, 3]
注意:参数每次指向同一个对象的地址。
def flist(l=[1]):l.append(1)print(l)flist()
flist()
输出为:
 [1, 1]
 [1, 1, 1]
2. 不可变类型作为参数
不可变对象:bool/int/float/tuple/str/frozenset
每次执行函数,会建立一个不可变对象的副本,因此参数每次指向一个新的不可变对象的地址。
def fstr(s):s += 'a'print(s)s = "hehe"
fstr(s)
fstr(s)
输出为:
 hehea
 hehea
3. 关键字参数
*args被打包成tuple
 **kwargs被打包成dict
def print_multiple_args(*args):print(type(args), args)for idx, val in enumerate(args):print(idx, val)print_multiple_args('a', 'b', 'c')
另一种方式为:
def print_multiple_args(*args):print(type(args), args)for idx, val in enumerate(args):print(idx, val)print_multiple_args(*['a', 'b', 'c'])
输出为:
 <class ‘tuple’> (‘a’, ‘b’, ‘c’)
 0 a
 1 b
 2 c
def print_kwargs(**kwargs):print(type(kwargs), kwargs)for k, v in kwargs.items():print('{}: {}'.format(k, v))print_kwargs(a=1, b=2, c=3, d=4)
另一种方式为:
def print_kwargs(**kwargs):print(type(kwargs), kwargs)for k, v in kwargs.items():print('{}: {}'.format(k, v))print_kwargs(**dict(a=1, b=2, c=3, d=4))
输出为:
 <class ‘dict’> {‘a’: 1, ‘b’: 2, ‘c’: 3, ‘d’: 4}
 a: 1
 b: 2
 c: 3
 d: 4
def print_all(a, *args, **kwargs):print(a)if args:print(args)if kwargs:print(kwargs)print_all('hello', 'world', name='Jack')
输出为:
 hello
 (‘world’,)
 {‘name’: ‘Jack’}