Python中的指针
我是一名物理学生,主要使用Python和Matlab编程,现在开始学习C语言,以提高我的模拟性能。
我有个简单的问题:Python里有指针吗?Matlab里有指针吗?如果有的话,我能像在C语言中那样“轻松”使用它们吗?
我知道在Python和Matlab这些高级语言的背后,其实有很多指针在运作。我的问题是:我能在Python或Matlab中像这样明确地使用指针,就像在C语言中那样吗:
int *p;
int someValue = 1;
p = &someValue;
doSomethingForMe = callSomeFunction(p);
我知道这样做可能没有什么意义(对于大多数应用来说)。我只是想学习。
2 个回答
在Python中,你可以使用ctypes
库来实现指针的功能。还有,你可以通过一些方法在Python中“模拟”指针的概念,就像这个问题中提到的那样。
在Matlab中,也没有指针的概念。
你可能会常常听到说,Python 有“名字”,而不是传统意义上的“变量”。而且它也没有“指针”,因为指针这个概念主要是在低级语言中才有意义,比如 C 语言。(所以,如果你在 Python 中使用 C 兼容库,比如 ctypes
,你可以得到“指针”。但这些指针只是为了和 C 语言互通用的。)
在 C 语言中,指针通常用来实现的功能,在 Python 中以其他方式存在。比如:
- 从一个函数返回多个值。在 C 语言中,你可能会写
int foo(int *, int *)
来返回两个整数(可能还会有一个错误代码)。而在 Python 中,你只需使用元组解包:x, y = foo()
,在foo
函数中使用return x, y
。 - 传入大型对象。因为在 Python 中一切都是通过引用传递的,所以你可以安全地传递一个大型对象的引用,而不需要担心它会被复制。
修改输入参数。大部分情况下,你可以通过选择合适的可变输入来实现。例如,你可以将一个列表传入函数,并在函数内部修改这个列表。在 Python 中,由于引用是相同的,输入的列表看起来会被修改:
def change_list(l): l[0] = 3 my_list = [1,2,3] change_list(my_list) print(my_list) # prints [3, 2, 3]
MATLAB 的变量概念与 Python 不同。在 MATLAB 中,变量是一个具有某些维度的矩阵。写 x = y
实际上是将 y
复制到 x
中(并适当地设置 x
的维度)。MATLAB 内部会进行优化,避免在不必要的情况下实际复制数据,但对程序员来说,x
和 y
看起来像是两个独立的矩阵。
MATLAB 也没有指针,除非你在处理编译的 MEX 扩展(这些扩展是用其他语言如 C 编写的)。和 Python 一样,MATLAB 也有一些机制可以在不需要指针的情况下传递数据(例如多个输入和输出参数)。