关于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~!
# 数字、字符串、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 中 值传递 引用传递 可更改(mutable)与不可更改(immutable)对象
- python函数参数是值传递还是引用传递:取决于对象内容可变不可变
- python函数参数是值传递还是引用传递(以及变量间复制后是否保持一致):取决于对象内容可变不可变
- python函数参数是值传递还是引用传递(以及变量间复制后是否保持一致):取决于对象内容可变不可变
- python学习之路——函数关于可变对象和不可变对象问题
- 关于python的可变和不可变对象
- python的raw_input()函数。 函数的可变对象和不可变对象作为参数传递。
- Python中的可变对象和不可变对象传递
- python不可“用可变对象作默认参数”
- Python陷阱:为什么不能用可变对象作为函数的默认参数值
- Python中的可变、不可变对象和赋值技巧
- Python中函数的参数传递与可变长参数介绍
- 关于js中一个对象当做参数传递是按值传递还是按引用传递的个人看法
- 可变长参数列表误区与陷阱——va_arg不可接受的类型
- Python中可变对象和不可变对象
- 通过参数传递,判断数字、字符串、list、tuple、词典等数据类型是否为可变数据对象。
- 关于Python函数参数传递方式--值传递?引用传递!
- python中的可变对象和不可变对象
- python 函数传递可变参数的用法
- Python学习笔记——可变对象和不可变对象