鱼C论坛

 找回密码
 立即注册
查看: 1756|回复: 3

[已解决]给函数传递参数时其实是传递了值的拷贝,应该说Python的函数调用实际是值的拷贝…

[复制链接]
发表于 2023-5-26 16:20:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
def add(x):
        x += 1
        print('x =', x)

>>> a = 1
>>> add(a)
x = 2
>>> print(a)
1

a在这里应该是实参吧?它应该相当于就是add()函数在定义时的形参x

通过add(a)调用add()函数,同时把a的值也就是1作为实参传入

执行后,看一下上面的结果:

---x的值(也就是a的值)原来确实是1,现在是2,所以x的值确实+1了

---但a的值仍然还是1
最佳答案
2023-5-26 16:27:13
在Python中,变量是以引用的形式传递的,所以有时候我们可能会说它是“传引用调用”。然而,这种说法并不完全准确。Python中的参数传递既不是纯粹的传值调用,也不是纯粹的传引用调用。因为Python的参数传递有“传对象引用”的行为特点。

当我们在Python中传递变量给函数时,实际上我们传递的是对于这个变量对象的引用,而不是变量的值。当在函数内部修改参数值的时候,实际上是创建了一个新的对象,并且修改了函数内部对应的引用,但是并不会影响到原本传入的变量的引用。

在你的例子中, x += 1 这一行实际上做了两件事情。首先,它计算出 x + 1 的值,然后,它创建了一个新的整数对象来保存这个值。然后, x 这个名字被重新指向了这个新的整数对象。但是,这个操作并没有影响到原来的 a 的值,因为 a 仍然指向原来的整数对象。

总的来说,Python的参数传递是以“传对象引用”的方式进行的。如果你在函数内部修改了参数的值,这个修改不会影响到原来的变量,因为你实际上只是修改了函数内部对应的引用,而并没有修改原来的变量的引用。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-26 16:27:13 | 显示全部楼层    本楼为最佳答案   
在Python中,变量是以引用的形式传递的,所以有时候我们可能会说它是“传引用调用”。然而,这种说法并不完全准确。Python中的参数传递既不是纯粹的传值调用,也不是纯粹的传引用调用。因为Python的参数传递有“传对象引用”的行为特点。

当我们在Python中传递变量给函数时,实际上我们传递的是对于这个变量对象的引用,而不是变量的值。当在函数内部修改参数值的时候,实际上是创建了一个新的对象,并且修改了函数内部对应的引用,但是并不会影响到原本传入的变量的引用。

在你的例子中, x += 1 这一行实际上做了两件事情。首先,它计算出 x + 1 的值,然后,它创建了一个新的整数对象来保存这个值。然后, x 这个名字被重新指向了这个新的整数对象。但是,这个操作并没有影响到原来的 a 的值,因为 a 仍然指向原来的整数对象。

总的来说,Python的参数传递是以“传对象引用”的方式进行的。如果你在函数内部修改了参数的值,这个修改不会影响到原来的变量,因为你实际上只是修改了函数内部对应的引用,而并没有修改原来的变量的引用。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-26 17:06:08 | 显示全部楼层
是的,您说得很对。在Python中,函数调用时实际上传递的是值的拷贝,也就是说传入函数的是实参的一个副本。所以当在函数内部修改这个副本的值时,并不会影响到原始的实参。
在这个例子中,使用a作为实参调用add()函数后,实际上传递给函数的是1的一个拷贝,也就是形参x的初始值是1。在函数内部x被修改为2,但这个修改对原始的实参a并没有影响,因为a和x是两个不同的变量。
需要特别注意的是,在Python中,如果实参是可变的类型(比如列表、字典等),那么在函数内部对这个可变类型进行修改,会改变原始实参的值。这是因为可变类型对象在传递时,传递的是对象的引用,而不是值的副本。所以对于可变类型来说,传递的是指向这个对象的引用,对这个引用所指向的对象做出的修改会对原始实参产生影响。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-26 18:44:10 | 显示全部楼层
本帖最后由 lzb1001 于 2023-5-26 18:45 编辑
isdkz 发表于 2023-5-26 16:27
在Python中,变量是以引用的形式传递的,所以有时候我们可能会说它是“传引用调用”。然而,这种说法并不完 ...


感谢大神指点。

……当在函数内部修改参数值的时候,实际上是创建了一个新的对象,并且修改了函数内部对应的引用,但是并不会影响到原本传入的变量的引用。……

不好意思,刚看到了,结合例子解释在下一段。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-23 01:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表