首先, python的传参方式叫做 共享传参 (call by object), 其实就是引用的副本
我们知道,有的语言函数的参数,传递的是引用,就是指向这个对象的指针, 有的语言传递的是参数的拷贝值。
但是python不一样,它传递的是对象的引用(简单说就是形参和实参指向同一个对象)。再根据对象是否可变,表现出两种情况。
首先看代码, 这个是可变类型的例子。
def flist(l): l.append(0) print(l) ll = [] flist(ll) flist(ll)
结果是: [0]
[0,0]
首先我们创建了一个[], 我们用 ll 来指向这个[], 指向的是这个地址。
然后调用函数,在函数内部, 用l 来指向传入的ll, 第一次调用函数,l指向了ll, 第二次调用, 函数内部重新定义了一个l, 同样指向了ll。
我们再看第二个例子
def fstr(s): s += "a" print(s) ss = "hehe" fstr(ss) fstr(ss)
结果是: hehea
hehea
其实和上面类似,但是在函数内部,s指向了ss的时候, 发现,这个对象是个不可变对象,对创建了一个副本,然后再把s指向这个新的对象,在进行修改。
不可变对象 : bool/int/float/tuple/str/forzenset
可变对象: list/dict/set