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’}