
正文
python调用函数传值 python函数值传递和引用传递
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
Python 函数中,参数是传值,还是传引用
这个问题的答案无外乎这几种说法:传值python调用函数传值,传引用,对于可变对象是传引用,不可变对象是传值。
传引用
先看下面这个例子:
def foo(n):
... print id(n)
... n = 3
... print id(n)
n = 2
id(n)
31030000L
foo(n)
31030000L
31029976L
n
2
id(n)
31030000L
由foo中两次输出不相等可以看出,传引用说法并不成立。
传值
来看下面的例子:
def foo(n):
... print n
... n.append(3)
... print n
n = [1, 2, 4, 8]
foo(n)
[1, 2, 4, 8]
[1, 2, 4, 8, 3]
n
[1, 2, 4, 8, 3]
按传值的说法,一个值传进来,在函数内改动并不会影响变量本身的值,上面例子中n变量本身的值也被改变python调用函数传值了,说明传值的说法也不对。
3.可变对象传引用,不可变对象传值
相比上面两种说法,这种说法似乎更靠谱,传播也更为广泛,那它到底对不对呢?
def foo(n):
... print id(n)
... n = ['1', '2', '3']
... print id(n)
... print n
n = [1,2,3,4,5,6]
id(n)
35637576
foo(n)
35637576
35916168
['1', '2', '3']
n
[1, 2, 3, 4, 5, 6]
按照可变对象传引用的说法,上面list类型是可变对象,应该传引用,这foo方法中两次调用id应该输出一样的值,更改的结果也应该影响到外部变量,但结果显然不是这样的,这说明,这种说法也是不正确的。
那么Python传值的方法到底是什么样呢?其实Python中的函数参数所遵循的是传对象(call by object),或者叫做穿对象的引用(call by object reference)。在调用函数时,将变量整个对象传入,对于可变对象的修改,在函数内外均可见;而对于不可变对象,因为其并不能真正意义上被赋值,修改是通过生成新的对象来实现的。
下面来一个有趣的例子作为结尾:
def bar(a = []):
... print id(a)
... a.append(7)
... print a
for _ in range(5):
... bar()
#结果输出请自己动手实践,原因应该不难理解
相关问答
Q1: python中视图函数传值的数据类型可以传对象吗
python的一切数据类型都是对象。但是python的对象分为不可变对象和可变对象。python的变量是引用,对python变量的赋值是引用去绑定该对象。
可变对象的数据发生改变,例如列表和字典,引用不会更改绑定对象,毕竟本身就是用于增删改查的,频繁地产生新对象必然导致开销巨大,只需要该对象内部变化就行;但对于绑定了不可变对象的引用,对象一旦改变就会使引用绑定新的对象。
这一点也会反应到函数的参数上。python的传值方式是“传对象”引用。python的函数,形参实际上是引用,实参便是对象绑定到该引用上。本质是形参会被作为函数的局部变量,在开辟的函数的栈内存中被声明。
简要来讲:
如果参数是数,则类似值传递,
如果参数是列表和字典,则类似引用传递。
每个对象都会有个id, 可以用id()验证以上说法:
这个函数的参数是列表,是可变对象。
Q2: Python中函数调用是传值还是传引用
python中所有数据都是对象python调用函数传值,所以传参也是传python调用函数传值的对象的引用,这个引用在函数执行前和执行后是不会被改变的,如:
num
=
1
def
change(num):
print(id(num))
num
=
2
print(id(num))
执行change(num)后num的值还是1
可以看到在执行前num的id值(可以理解为内存地址)是某一值
但在执行change后,num的id值改变了,也就是说内部的num指向了另外的对象,而外部的num却还是指向原来的对象,所以值没有变python调用函数传值;
同理,如:
num_list
=
[1,2]
def
change_list(num_list):
print(id(num_list))
num_list.append(3)
print(id(num_list))
可以看到执行change_list后num_list的id值没有改变,也就是说num_list是在原来的对象上添加了新的数据,外部的num_list也是指向这一对象,所以外部的num_list数据也添加了新的数据。
Q3: python中定义函数时至少要传递一个参数的值对吗
不对。根据查询相关资料信息,python中定义函数时传递特点是必须被传值,多一个不行少一个也不行。
关于python调用函数传值和python函数值传递和引用传递的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。







