lzb1001 发表于 2023-5-26 16:20:46

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

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

isdkz 发表于 2023-5-26 16:27:13

在Python中,变量是以引用的形式传递的,所以有时候我们可能会说它是“传引用调用”。然而,这种说法并不完全准确。Python中的参数传递既不是纯粹的传值调用,也不是纯粹的传引用调用。因为Python的参数传递有“传对象引用”的行为特点。

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

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

总的来说,Python的参数传递是以“传对象引用”的方式进行的。如果你在函数内部修改了参数的值,这个修改不会影响到原来的变量,因为你实际上只是修改了函数内部对应的引用,而并没有修改原来的变量的引用。

歌者文明清理员 发表于 2023-5-26 17:06:08

是的,您说得很对。在Python中,函数调用时实际上传递的是值的拷贝,也就是说传入函数的是实参的一个副本。所以当在函数内部修改这个副本的值时,并不会影响到原始的实参。
在这个例子中,使用a作为实参调用add()函数后,实际上传递给函数的是1的一个拷贝,也就是形参x的初始值是1。在函数内部x被修改为2,但这个修改对原始的实参a并没有影响,因为a和x是两个不同的变量。
需要特别注意的是,在Python中,如果实参是可变的类型(比如列表、字典等),那么在函数内部对这个可变类型进行修改,会改变原始实参的值。这是因为可变类型对象在传递时,传递的是对象的引用,而不是值的副本。所以对于可变类型来说,传递的是指向这个对象的引用,对这个引用所指向的对象做出的修改会对原始实参产生影响。

lzb1001 发表于 2023-5-26 18:44:10

本帖最后由 lzb1001 于 2023-5-26 18:45 编辑

isdkz 发表于 2023-5-26 16:27
在Python中,变量是以引用的形式传递的,所以有时候我们可能会说它是“传引用调用”。然而,这种说法并不完 ...

感谢大神指点。

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

不好意思,刚看到了,结合例子解释在下一段。
页: [1]
查看完整版本: 给函数传递参数时其实是传递了值的拷贝,应该说Python的函数调用实际是值的拷贝…