关于Python与c语言的传参问题
我们都知道函数的参数分为形参和实参。
形参就是指函数声明中的参数。
实参就是指才函数调时所需的参数。
函数的形参实质上是以局部变量的形式存在函数内部。
Python中的变量好像是一个标签。
c语言中的变量是数据内存位置的名称。C语言中的变量也有自己的地址,如int a;(可以不赋值,而Python中的变量在声明时必须赋值),a = 2,(实质是开辟4个字节的内存空间存放2,同时把这一段空间的起始地址赋值给a,即将这个起始地址存储到a中)。
Python中
我认为Python中传参时,实质传递的是实参的地址。在Python中的数据类型又分为可变数据类型与不可变数据类型。其中可变数据类型包括(number、string、tuple),不可变数据类型包括(list、set、dict)。
例如,
当传递的实参是不可变数据类型时,相当于将实参所指向地址传递给了形参,即使形参和实参同时指向了同一块地址单元。如果在函数内部修改形参,实参是不会改变的。这种改变实质修改了形参所指向的地址单元(因为实参是不可变数据类型)。从形式上看是所谓的值传递,就其本质而言是地址传递。
当传递的实参是可变数据类型时,调用函数是的参数传递本质也是地址传递,如实参是一个list类型,参数的传递实质是将实参所指向的地址赋值给形参,此时实参和形参指向同一块地址单元。在函数内部修改形参的内容时,由于实参是可变数据类型,相当于就是修改形参所指向的内存单元中的内容,因为形参和实参指向的是同一块地址单元,所以在函数中修改形参时实参的内容也会改变。这种情况下称之为地址传递,本质也就是地址传递。
因此,Python中的参数传递本质上都是地址传递,只是根据实参的类型不同,其表现的形式不同,我们区分为值传递与地址传递。
c语言中
我认为c语言中的参数传递默认都是值传递,即是将实参的值复制一份赋值给形参,在这种情况下形参内容的修改是不会影响实参的,因为形参和实参的地址是不同的。(值传递)
如果想要通过形参的改变修改实参,在参数的的传递时要传递实参的地址,在函数中的形参(局部变量)会复制实参地址,通过修改实参地址所指向内存单元中的内容,从而修改实参。(地址传递)实参的地址(实参变量中保存的地址),地址传递有点类似于计算机组成原理中的直接寻址
在c++中还用一种引用传递(实参变量的别名,实质传递的是实参变量的地址),通过在函数声明的头部的形参前面添加&的标识。这种引用传递与地址传递的作用效果相同,但是原理不同。引用传递在函数中开辟了一段地址空间存放的是实参变量的地址,在修改实参时,首先要通过实参变量的地址找到实参变量,再从实参变量中取出实参的地址,需要经过两次寻址,类似于计算机组成原理中的间接寻址。