您的位置:首页 > 编程语言 > Python开发

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

2017-11-18 00:01 721 查看
从简,不说废话:

# 数字、字符串、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~!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息