一、基础知识
在C与C++中创建函数并修改形参时,若用值传递方式传参数,则实参的值不会改变,若用引用传递方式传参数,则实参的值会相应地改变。
在如下C++程序中,x1与x2是形参,a1与a2是实参,运行程序可发现,修改x1与x2,a1保持不变,a2从0变成1。
//运行环境:
// 操作系统:windows7
// 编程工具:vs2017
// 项目:windows控制台应用程序
#include "pch.h"
#include <iostream>
using namespace std;
int f1(int x1) //值传递
{
x1 = 1;
return 0;
};
int f2(int *x2) //引用传递
{
*x2 = 1;
return 0;
};
int main()
{
int a1, a2;
a1 = 0;
a2 = 0;
f1(a1);
cout << "a1 = " << a1 << endl;
f2(&a2);
cout << "a2 = " << a2 << endl << endl;
}
运行结果:
二、Python传不可变对象与可变对象
因为在Python中一切皆对象,所以,Python不说值传递与参数传递,而讲传不可变对象与可变对象。其中Python编程没有指针,实现引用传递可通过list列表实现。
在如下Python程序中需要注意:
1. f1函数传不可变对象, 相当于值传递,修改形参x1不会改变实参a1的值;
2. f2函数传可变对象,也是值传递,虽然实参a2是list列表,但是在f2函数内并未说明形参x2是list列表,所以修改x2不会改变a2的值;
3. f3函数传可变对象,相当于引用传递,修改形参x3会改变实参a3的值,因为x3与a3都是list列表。
# 运行环境:
# 操作系统:windows7
# 编程工具:pycharm2018.2
# 开发语言:python3.7
def f1(x1):
x1 = 1
def f2(x2):
x2 = 1
def f3(x3):
x3[0] = 1
a1, a2, a3 = 0, [0], [0]
f1(a1)
f2(a2)
f3(a3)
print(a1, a2, a3)
运行结果: