Python and Java parameter passing
我在一些地方见过,包括Python使用传递"赋值"语义的Python文档。来自Java背景的,在这里常见的错误是"Java通过值传递原语,引用对象引用"是由于对象引用通过值传递的结果,我不禁想知道Python是否真的在做同样的事情。
在我看来,按值传递对象引用和传递赋值的概念是相同的。python使用"pass-by-assignment"一词是否试图缓解存在错误语句(如我上面描述的语句)的问题?如果是这样,是否公平地说参数传递在两种语言中以类似的方式工作?
编辑:我不认为这个问题是重复的。这里我要问Python使用的术语,直接引用Java是如何做事情的。另一个问题是语言是传递值还是传递引用。我知道通过赋值是这里使用的术语,但我的论点似乎得到了公认的答案的支持,这与Java做事情没有什么不同,只是一个不同的名字而已。
- 是的,可以这么说。但请记住,在Python中,一切都是一个对象,没有"原语"。但你说得对,一切都是按价值传递的。传递引用是在基于指针的语言中发现的概念,如C/C++。@该组织的Luiggi说这样说是一个常见的错误。
- "LuiggimimDeZa"中常见的错误:"Java按值传递原语,按引用传递对象"
在这方面,Python似乎相当于爪哇。来自http://learnpython.pbworks.com/w/page/15956522/assignment:
But you must be careful about what is meant by"changes to
parameters". Assigning a new value to a parameter name (inside the
function, a parameter is just a local variable) does not change the
original object--it only rebinds the local variable to a new object.
所以,python按值传递"对象引用"。
- 只是澄清一下:python实际上通过引用传递参数。对形式参数名的赋值将覆盖以前的引用。在函数f(l)中尝试l.append("Hello")。原始对象将被修改。在这方面,Python更类似于C++的引用。
- 奥拉夫,这正是我所说的意思,而Java的行为也一样。可以修改引用的对象,但在函数/方法中重新分配引用不会影响调用方的引用。
- 是的,我只是想澄清这一点,因为我先是以不同的方式阅读了你的答案,直到我对这些引语有了一些了解。只是不确定我是否正确地解释了你的答案。
- 奥拉夫:"在这方面,Python更类似于C++的引用。"不,Python中传递和赋值的语义与Java中的语义完全相同,它与C++中对象的指针完全相同。C++引用是完全不同的东西。
- @newacct:我不同意,因为两者基本上都是指针,但是使用不同的语法和引用隐藏了一些指针方面。然而,由于我很难用英语准确地解释我对这一点的想法,我想我们应该承认,在这方面我们可能存在分歧。
- 确实,Java引用只是指针(作为来自NulLoPoExtExchange的证据),但它们与C++指针不同。我不确定确切的细节,但这与将对象分配给指针或方法中的对象引用有关。在C++中,如果在方法中重新分配,这将影响外部范围,而使用Java/Python则不会影响外部范围。
- @奥拉夫:我说的正是语法和语义。它相当于C++指针。它根本不等同于C++引用。
- ORRYMR:不,它们完全等价于C++指针,因为同一结构的同一代码在两个方面总是具有相同的行为。无论您在Java/Python中引用引用,也适用于C++中的指针,反之亦然。
- @那么,当我输入:cat mycat时,这会使mycat成为指针吗?只有一次输入:MyCAT=新MyCAT("Gorlax驱逐舰");指向新的CAT对象的指针(或Java引用)MyCAT?
- @是的,没错。