gpt4 book ai didi

python - 所有对象都是按值而不是按引用返回的吗?

转载 作者:太空宇宙 更新时间:2023-11-04 09:52:25 26 4
gpt4 key购买 nike

我正在用 Python 编写代码,试图决定是应该返回一个 numpy 数组(对其他数组进行 diff 的结果)还是返回 numpy.where(diff)[0],这是一个较小的数组,但需要的很少额外的工作来创造。我们将发生这种情况的方法称为 methodB。

我从方法 A 调用方法 B。问题是我不一定总是需要 methodA 中的 where() 结果,但我可能会。那么在 methodB 中做这项工作是否值得,或者我应该传回(内存更大的)diff 本身,然后只在需要时在 methodA 中进一步处理它?假设 methodA 只是获得对结果的引用,那将是更有效的选择。

那么,函数结果在传回调用该函数的代码时是否从未被复制过?

我相信当 methodB 完成时,它的框架中的所有内存都将被系统回收,所以 methodA 必须实际复制 methodB 返回的任何内容到它自己的框架中,以便能够使用它。我将其称为“值(value)返回”。这是正确的吗?

最佳答案

是的,你是对的。在 Python 中,参数总是按值传递,返回值总是按值返回。但是,返回(或传递)的值是对潜在共享、潜在可变对象的引用。

对于某些类型,返回或传递的值可能是实际对象本身,例如整数就是这种情况,但只有可变对象才能观察到两者之间的差异,而整数不是可变对象,并且取消引用对象引用是完全透明的,因此您永远不会注意到差异。为了简化你的心智模型,你可以假设参数和返回值总是按值传递(无论如何这是真的),并且被传递的值总是一个引用(这并不总是正确的,但你不能分辨出区别,您可以将其视为简单的性能优化)。

请注意,按值传递/返回引用与按引用传递/返回完全不同(当然也不是一回事)。特别是,它不允许允许您更改调用方/被调用方中的名称绑定(bind),因为引用传递允许您这样做。

这种按值传递的特殊风格,其中值通常是一个引用,在例如ECMAScript、Ruby、Smalltalk 和 Java,有时被称为“对象共享调用”(我相信是 Barbara Liskov 创造的)、“共享调用”、“对象调用”,特别是在 Python 社区中“调用分配”(感谢 @timgeb )或“通过名称绑定(bind)调用”(感谢 @Terry Jan Reedy )(不要与通过名称调用混淆,这又是另一回事)。

关于python - 所有对象都是按值而不是按引用返回的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47253169/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com