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指向这个新的对象,在进行修改。

 

 

 

不可变对象 :  tuple  forzenset tuple、str 和 bytes。

可变对象: list bytearray、array.array、collections.deque memoryview。

 

posted @ 2020-03-02 22:32  DRQ丶  阅读(640)  评论(0编辑  收藏  举报