我可以像在 c++ 中使用指针一样修改函数中的变量而不在 python 中返回吗

Posted

技术标签:

【中文标题】我可以像在 c++ 中使用指针一样修改函数中的变量而不在 python 中返回吗【英文标题】:Can i modify variable in function without return in python like using pointers in c++ 【发布时间】:2022-01-14 02:33:33 【问题描述】:

我只是想学习如何在 python 中编写这个 c++ 代码?

#include <iostream>

void modify(int* a)
    *a = 20;


int main()

    int x = 10;
    modify(&x);
    std::cout << x;
    // OUTPUT: 20
    return 0;

【问题讨论】:

你可以通过将要变异的整数放在一个列表中来模仿它,但这不是惯用的。 Python 没有指针 我知道python没有,但我不能在python中做这样的函数 这有帮助吗:***.com/a/986145/9814037?楼主的回答不错。 此外,关于指针这里是一个理论:***.com/a/3106752/9814037 【参考方案1】:

这不适用于整数,因为 python 中的整数是完全不可变的。您不能在 python 中更改整数。 例如,当您执行 a += 1 时,您将创建一个值为 a + 1 的新 int 并将变量 a 绑定到它。 现在,最简单的方法是使用一些引用类型,比如类。

class IntRef:
  def __init__(self, a):
    self.a = a

def modify(some):
  some.a = 20

ir = IntRef(10)
modify(ir)
print(ir)

【讨论】:

【参考方案2】:

简单的答案是“你不能”。但是,如果您有一个需要等效行为的用例,最简单的方法是将变量包装成可变类型。我会做以下事情:

def modify(a):
    a[0] = 20

x = [10]
modify(x)
print(x[0])

【讨论】:

是的,这行得通,但我不明白为什么行得通。不应该是函数中的局部变量吗? @cacarekt a 表示列表,而不是列表的内容。因此,当我们说a[0] = 20 时,我们正在更改列表的内容,但列表本身不受影响。具体来说,a 是对列表开头的引用。我们没有改变开始的地方,只改变了之后的内容。 为此滥用列表将对性能产生极大的不利影响。这不是 C,列表不是固定大小并被编译掉。改用类 @DownloadPizza 没有迹象表明性能是一个问题。这更简单,类更快,更好的是完全依赖于上下文。

以上是关于我可以像在 c++ 中使用指针一样修改函数中的变量而不在 python 中返回吗的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中结束函数,就像在 C++ 中使用“return”一样 [关闭]

Cython 中的 C++ 指针

C# 托管

有没有办法像在 C++ 中挂钩非托管函数一样在 C# 中挂钩托管函数?

有没有办法像在 C++ 中挂钩非托管函数一样在 C# 中挂钩托管函数?

是否可以像在 VS 中拖动箭头一样在 java eclipse 调试器中“返回”