【问题标题】:pointers in python [duplicate]python中的指针[重复]
【发布时间】:2013-03-08 08:53:39
【问题描述】:

我是一名物理专业的学生,​​主要使用 Python 和 Matlab 进行编程,现在正在学习 C 以提高我的模拟性能。

简单的问题:Python 中有指针吗? Matlab中有指针吗?如果是,我可以像在 C 中一样“轻松”地使用它们吗?

我知道在 Python 和 Matlab 的高层次背后,有很多指针在起作用。问题是:我可以在 Python 或 Matlab 中明确地做类似这样的 C 代码吗:

int *p;
int someValue = 1;
p = &someValue;
doSomethingForMe = callSomeFunction(p);

我知道这样做可能毫无意义(对于大多数应用程序)。我只是想学习。

【问题讨论】:

  • 这是 A/B 问题的经典示例。你问的是指针,但实际上你根本不关心指针,你关心的是 C 需要指针的东西。正如 nneonneo 指出的那样,在大多数情况下,您不需要 Python 中的指针。
  • 这是一个非常明智的区分,当您刚刚学习这些概念时(就像我一样)。通常你只是问自己“这到底是什么?为什么我不能在 Python 中做到这一点?”

标签: python c matlab pointers


【解决方案1】:

您通常会听到Python has names,而不是传统意义上的“变量”。它也没有“指针”,因为这样的概念仅在低级别工作时才有意义,例如使用 C。(因此,如果您在 Python 中使用 C 兼容性库,您可以获得“指针”,例如 @ 987654322@。但是,这样的指针仅用于与 C 的互操作性。)

在 C 中使用指针的大多数功能在 Python 中以其他形式存在。例如:

  • 从一个函数返回多个值。在 C 语言中,您可以使用 int foo(int *, int *) 返回两个整数(可能还有一个错误代码)。在 Python 中,只需使用元组解包:x, y = foo()return x, y in foo
  • 传入大对象。由于无论如何都是按引用传递的,因此您可以安全地将引用传递给一个巨大的对象,而无需复制它。
  • 修改输入参数。通过选择适当的可变输入,这大部分是可能的。例如,您可以将列表传递给函数并在函数内修改列表。在 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(适当地设置xs 尺寸)。 MATLAB 在内部进行优化以避免实际复制数据,除非必要,但对于程序员来说,xy 似乎是独立的矩阵。

MATLAB 也没有指针,除非您正在处理已编译的 MEX 扩展(它是用 C 等其他语言编写的)。与 Python 一样,您拥有无需指针即可传递事物的机制(例如,多个输入和输出参数)。

【讨论】:

  • 非常有帮助的答案!谢谢!我正在玩弄 SciPy 的 C 代码编织功能。它提供了良好的结果,但仅对较小规模的仿真代码有用。我正在考虑进入python的C-API。从你写的,我知道你只能将这么多的功能从 C 移植到 Python(或 Matlab)。
  • 视情况而定。 Python 和 MATLAB 是高级语言这一事实​​意味着您可以通过更少的行来控制更多的功能。尤其是优秀的 MATLAB 代码,其运行速度可能比您用纯 C 语言(即没有库)编写的任何代码都快很多,这仅仅是因为它很容易编写功能强大的代码,并且 MATLAB 引擎会自动采用CPU 功能(多核、矢量指令等)的优势。
  • 好的。那我再玩一会儿吧。
【解决方案2】:

您显然可以在 Python 中使用 ctypes 库的指针。另外,你可以simulate the notion of pointers in Python,就像这个问题一样。

在 Matlab 中你也没有指针。

【讨论】:

  • @JBernardo 我改变了答案。
猜你喜欢
  • 2020-04-18
  • 2010-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-07
  • 1970-01-01
  • 2021-10-21
相关资源
最近更新 更多