Python和Java参数传递[重复]
Posted
技术标签:
【中文标题】Python和Java参数传递[重复]【英文标题】:Python and Java parameter passing [duplicate] 【发布时间】:2015-06-28 21:09:21 【问题描述】:我在多个地方看到过,包括 Python 使用的 Python 文档通过“赋值”语义传递。来自 Java 背景,说“Java 按值传递基元,按引用传递对象”的常见错误是由于对象引用按值传递的结果,我不禁想知道 Python 是否真的在做同样的事情东西。
对我来说,按值传递对象引用和按赋值传递的概念似乎相同。 Python 使用“pass-by-assignment”这个术语是为了减轻我上面描述的错误语句的问题吗?如果是这样,是否可以说参数传递在两种语言中的工作方式相似?
编辑:我不认为这个问题是重复的。这里我问的是 Python 使用的术语,直接参考 Java 是如何做事的。另一个问题是关于语言是按值传递还是按引用传递。我知道通过赋值传递是这里使用的命名法,但我的论点似乎得到了公认的答案的支持,这与 Java 的处理方式实际上没有什么不同。只是名字不同而已。
【问题讨论】:
是的,可以这么说。但请记住,Python 中的一切都是对象,没有“原语”。但你是对的,一切都是按值传递的。通过引用传递是在 C/C++ 等基于指针的语言中发现的概念。 @Luiggi OP 说这样说是一个常见的错误。 @LuiggiMendoza '常见的错误说法“Java 通过值传递原语,通过引用传递对象”' 【参考方案1】:是的,Python 在这方面似乎与 Java 相当。来自http://learnpython.pbworks.com/w/page/15956522/Assignment:
但您必须注意“更改为 参数”。为参数名称分配一个新值(在 函数,参数只是一个局部变量)不会改变 原始对象——它只是将局部变量重新绑定到一个新对象。
因此,Python “按值”传递“对象引用”。
【讨论】:
澄清一下:Python 实际上是通过对它的引用来传递参数的。对形式参数名称的赋值将覆盖先前的引用。在函数f(l)
中尝试l.append("Hello")
。原始对象将被修改。在这方面,Python 更类似于 C++ 的引用。
@Olaf 这正是我的意思,Java 的行为方式也是如此。引用的对象可以修改,但在函数/方法中重新分配引用不会影响调用者的引用。
是的,我只是想澄清这一点,因为我确实首先以不同的方式阅读了您的答案,直到我对引号有所了解。只是不确定我是否正确解释了您的答案。
Java 引用确实只是指针(来自 NullPointerException 的证据),但它们与 C++ 指针不同。我不确定确切的细节,但这与将对象分配给方法中的指针或对象引用有关。在 C++ 中,如果您在方法内重新分配,这将影响外部范围,而在 Java/Python 中则不会。
@orrymr:是的,没错以上是关于Python和Java参数传递[重复]的主要内容,如果未能解决你的问题,请参考以下文章