关于Python参数传递时,传递可变对象(mutable)和不可变更对象(immutable)的误区

从简,不说废话:

    # 数字、字符串、tuple都是不可变对象  
    # list、dict是可变对象  
    #Python函数参数对于可变对象,函数内对参数的改变会影响到原始对象;对于不可变对象,函数内对参数的改变不会影响到原始参数。原因在于:可变对象,参数改变的是可变对象,其内容可以被修改。不可变对象,改变的是函数内变量的指向对象。  
      
      
      
    a = 1  
    d = [5]  
      
    def A(a):  
        a = 3  
      
    A(a)  
    print(a)    # 1 a是1(不可变对象)的引用,a存的是1的地址,调用A(a)的时候,会复制一份该引用,然后函数内是操作的复制的这一份引用,将其指向了3,与外面的引用没关系,外面的a还是指向1  
    # 字符串和tuple类似,tuple本身就是一旦初始化就不可以进行增删修改的。  
      
      
    def B(d):  
        d = [6] #这里相当于是一个赋值操作,类似于  
      
    B(d)  
    print(d)    # [5]  这里是5是因为B(d)相当于对函数内部复制了一份外面的d,对新复制的d进行赋值,不会影响到外面的d  
      
    def C(d):  
        d[0] = 2 # [2] 这里是2是因为C()方法里面并不是去创建了一个新的变量d而是对原先的d进行修改,而之所以能对原先的d进行修改就是因为list是可变对象  
      
    C(d)  
    print(d)  
      
    #为什么上面B()运行了输出还是5而下面C()运行了却变为了2呢?我想是因为上面B函数传进去的是d,同样会复制d,函数内部操作复制的这一份,内部的确实变为了[6],但外部的d并没有改变,但是在C函数中,并没有创建新的d,而是原先的d的进行了修改。  
    #总结:重新分配一个对象,是不会改变实参的,但是对对象进行修改,是可以改变实参的。  
      
    #可能有人又好奇了,为什么list是可变对象,而str不是呢,list可以遍历,而一个str也可以遍历,这里其实很简单,一个str虽然可以拆分为一个个char但是你不能去对单独的一个char进行修改,你可以试试p = 'www',虽然你可以打印出p[0],但是当你试图p[0] = 's',肯定就报错了。  

以上,如有不足,欢迎指出。Thanks~!

你可能感兴趣的:(Python,IT,python,编程,可变对象,不可变对象)