【发布时间】:2019-01-02 21:38:53
【问题描述】:
所以在 Python 中你可以做到以下几点:
def append(_list):
_list.append(1)
_list = [0]
append(_list)
print(_list)
这显然允许我将 1 附加到列表中,但是如果我在 append 函数中更改列表的引用,它不会改变(这是由于传递对象引用而预期的)。 Java 的工作方式类似,但它被认为是 Pass-by-Reference。这是否仅仅意味着 Python 在传递一个按值指向对象的指针然后取消引用时就像 C++ 一样(有点像使用 C/C++ 的 -> 运算符时)?
【问题讨论】:
-
你是什么意思 Java 工作方式类似,但它被认为是按值传递。?
-
Java 按值传递引用对吗?因此,您可以操作对象的内容,但不能操作对象的引用本身。
-
不要太纠结于为概念使用什么标签。重要的是,当您传递一个对象时,Java 和 Python 都传递了一个句柄值,被调用的代码可以使用它来引用实际参数。在 Python 中,即使是整数等基本类型的值也被视为对象。
-
是的,我的错:Java 确实通过引用来操作对象,并且所有对象变量都是引用。但是,Java 不会通过引用传递方法参数。它按值传递它们。
-
Java 对象参数传递和赋值语义本质上与 Python 的语义相同。这些语义没有一个好的、被广泛接受的名称。 Java 非常坚持将其称为按值传递,但在没有明确解释的情况下,将其称为按值传递并没有做任何事情来传达语义。有诸如“对象调用”或“共享调用”之类的术语,但它们太晦涩难懂,无法用于交流。
标签: python pass-by-reference pass-by-value