python的传参方式,哪些是可变对象,哪些是不可变对象?

首先, 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

猜你喜欢

转载自www.cnblogs.com/dairuiquan/p/12398574.html