Python中函数调用是传值还是传引用python不允许程序员选择采用传值还是传引用 。Python参数传递采用的肯定是“传对象引用”的方式 。这种方式相当于传值和传引用的一种综合 。如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值--相当于通过“传引用”来传递对象 。如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用 , 就不能直接修改原始对象--相当于通过“传值'来传递对象 。
Python 的函数是怎么传递参数的?首先你要明白,Python的函数传递方式是赋值,而赋值是通过建立变量与对象的关联实现的 。
对于你的代码:
执行 d = 2时,你在__main__里创建了d , 并让它指向2这个整型对象 。
执行函数add(d)过程中:
d被传递给add()函数后,在函数内部,num也指向了__main__中的2
但执行num = num10之后 , 新建了对象12,并让num指向了这个新对象——12 。
如果你明白函数中的局部变量与__main__中变量的区别,那么很显然,在__main__中,d仍在指着2这个对象,它没有改变 。因此 , 你打印d时得到了2 。
如果你想让输出为12,最简洁的办法是:
在函数add()里增加return num
调用函数时使用d = add(d)
代码如下:
def add(num):
num= 10
return num
d = 2
d = add(d)
print d
python中视图函数传值的数据类型可以传对象吗python的一切数据类型都是对象 。但是python的对象分为不可变对象和可变对象 。python的变量是引用,对python变量的赋值是引用去绑定该对象 。
可变对象的数据发生改变,例如列表和字典,引用不会更改绑定对象,毕竟本身就是用于增删改查的 , 频繁地产生新对象必然导致开销巨大,只需要该对象内部变化就行;但对于绑定了不可变对象的引用,对象一旦改变就会使引用绑定新的对象 。
这一点也会反应到函数的参数上 。python的传值方式是“传对象”引用 。python的函数,形参实际上是引用,实参便是对象绑定到该引用上 。本质是形参会被作为函数的局部变量,在开辟的函数的栈内存中被声明 。
简要来讲:
如果参数是数 , 则类似值传递,
如果参数是列表和字典,则类似引用传递 。
每个对象都会有个id, 可以用id()验证以上说法:
这个函数的参数是列表 , 是可变对象 。
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变量本身的值也被改变了,说明传值的说法也不对 。
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()
#结果输出请自己动手实践 , 原因应该不难理解
python中定义函数时至少要传递一个参数的值对吗不对 。根据查询相关资料信息,python中定义函数时传递特点是必须被传值,多一个不行少一个也不行 。
【python传值函数吗 python函数值传递】python传值函数吗的介绍就聊到这里吧,感谢你花时间阅读本站内容 , 更多关于python函数值传递、python传值函数吗的信息别忘了在本站进行查找喔 。
推荐阅读
- 食品小吃工厂直播带货文案,食品小吃工厂直播带货文案简短
- 怎么将安卓手机卡槽拿出来,安卓手机手机卡怎么拿出来
- 如何运营公司新媒体账号,新媒体公司运营模式
- 体育游戏耐力,耐力游戏教案
- php提交的数据乱码 php提交的数据乱码怎么回事
- gis找不到afcore,gis找不到图像在哪
- 很忙的直播运营,很忙的直播运营怎么做
- python库函数画画 python代码库画图
- MySQL初始密码有个反括号,mysql密码怎么输都不对