最近C语言和python交替使用,突然对两种语言函数参数传递问题有所混淆,故整理之,如有不对请多多指正。
对于C语言,就拿通过函数改变变量 int x = 2来讨论。
错误的做法是:
#include<stdio.h>
int x = 2;
int change(int x);
int main(void)
{
printf("%d\n",x);
change(x);
printf("%d\n",x);
return 0;
}
int change(int x)
{
x = 4;
return 0;
}
其输出为:
>>>x=2
为什么未改变x的值,是因为此时函数参数传递相当于值传递,也就是传递的是x的一个副本,副本的改变不会影响原值。我们不妨从x的地址来看。
#include<stdio.h>
int x = 2;
int change(int x);
int main(void)
{
printf("%d\n",&x);#全局变量x地址
change(x);
return 0;
}
int change(int x)
{
printf("%d\n",&x);#传入参数的地址
x = 4;
return 0;
}
其输出为:
>>>4344368
>>>1703664
也既证明了传值只是创造了一个副本,对原值无影响。
而引用传递就是将地址作为参数传给函数,对于C而言分为原址&x,和间接定义一个指针ptr->x,通过函数内修改地址上的值即可以改变全局变量x的值。代码与上面类似,不论述了。
而对于python,由于都是面向对象,传入参数按照C语言理解就是传引用。例子分析,与上面的C语言功能类似。
def change(x):
print(id(x))
x = 4
print(id(x))
return x
if __name__ == "__main__":
x=1
print(id(x))
change(x)
print(x)
输出为:
>>>1869531216 #x所指向对象的地址
>>>1869531216 #传入函数的参数x的地址(和上面的相等,证明了传递的是引用)
>>>1869531248#而当x = 4时,相当于把x指向了新的对象———4,x的地址变为新的地址。
>>>1 #为什么x的地址变为新的地址后,回到主函数后x的值没有改变呢?我的理解是由于python里x=2,或是x=(1,2,3),x=string这三种结构是不可变的,函数内令x=4实际上是创建了一个x的副本令其指向对象4,相当于值传递,而函数运行后回到main函数,x所指向的对象仍不变。也即输出x=1。
PS:个人理解,请多多指教