Python和Java的参数传递方式

16

我在多个地方看到过Python文档中提到Python使用赋值传递语义,包括在Java背景下常见的错误说法“Java按值传递基本类型,按引用传递对象”。这是因为对象引用被按值传递造成的。这让我不禁想知道Python是否真的在做同样的事情。

在我看来,按值传递对象引用和赋值传递似乎是一样的概念。Python使用“赋值传递”这个术语是为了减少出现上述错误的可能性吗?如果是,那么可以说两种语言中参数传递的工作方式是相似的吗?

编辑:我认为这个问题并不重复。这里我在直接参考Java的情况下询问Python使用的术语。另一个问题是关于语言是按值传递还是按引用传递的。我知道这里使用的是“赋值传递”的名称,但我的观点是这与Java的做法没有什么区别;只是名称不同而已。


是的,可以这么说。但请记住,在Python中,所有东西都是对象,没有“基本类型”。但你说得对,所有东西都是按值传递的。按引用传递是指针语言(如C/C++)中的一个概念。@Luiggi OP说这是一个常见错误 - Shashank
2
@LuiggiMendoza:“Java传递基本类型按值传递,传递对象按引用传递”这种说法是一个常见的错误。 - Anderson Vieira
1个回答

13

在这方面,Python似乎与Java等价。引用自http://learnpython.pbworks.com/w/page/15956522/Assignment

但是,您必须注意“更改参数”的含义。将新值分配给参数名(在函数内部,参数只是局部变量)不会更改原始对象——它只会将局部变量重新绑定到一个新对象。

因此,Python通过“传值方式”传递“对象引用”。


1
只是为了澄清:Python实际上通过引用传递参数。对形式参数名称的赋值将覆盖先前的引用。在函数f(l)内尝试使用l.append("Hello")。原始对象将被修改。在这方面,Python更类似于C++的引用。 - too honest for this site
3
@Olaf 这正是我想要表达的,Java 的行为也是如此。引用的对象可以被修改,但在函数/方法内重新分配引用不会影响调用者的引用。 - GriffeyDog
是的,我只是想澄清一下,因为我最初读了你的回答,直到我思考引号时才有所不同。只是不确定我是否正确解释了你的回答。 - too honest for this site
1
Java 引用确实只是指针(如 NullPointerException 所示),但它们与 C++ 指针不同。我不确定具体细节,但与在方法中将对象分配给指针或对象引用有关。在 C++ 中,如果在方法内部重新分配,这将影响外部范围,而在 Java/Python 中不会。 - orrymr
1
@orrymr:是的,完全正确。 - newacct
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接