【问题标题】:Is Python similar to the -> operator in C/C++?Python 是否类似于 C/C++ 中的 -> 运算符?
【发布时间】: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


【解决方案1】:

在 Python 中,一切都是对堆的引用。在 Java 中,您可以拥有存在于堆栈上的原始类型,它们不引用堆上的任何内容,但其他所有内容都是对堆上对象的引用(甚至是原始数组)。

在函数调用期间,引用(或原语)被复制到 Java 和 Python 中的新堆栈帧。

C 可以将复杂的结构(如结构和数组)放在堆栈上。但是没有堆栈对象不是 Python 中的引用的概念。这与在 C 中非常不同,在 C 中,您不仅可以将对象复制到新的堆栈帧,而且实际上可以将指针传递给位于较早堆栈帧上的对象。

【讨论】:

    【解决方案2】:

    Python 中的重要区别不是按值传递或引用,而是可变对象和不可变对象之间的区别。

    基本上所有内容都是通过引用传递的,但是如果对象不允许您修改它(它是不可变的),则您无法更改传递引用的原始对象。例如 Python ints 是不可变的,因此即使 int 是通过引用传递的,您也永远无法修改原始对象。如果你想这样做,你必须将对象包装在一个可变对象中,例如一个列表。列表可以修改(追加、弹出等)

    所以你“可以”说 Python 的属性访问 . 类似于 C++ 的 ->,但这对于 Python 来说是一种奇怪的术语。

    在您的示例中,您传递了一个可变对象(列表)。所以追加会修改原始对象。因此,您的代码输出为[0, 1]。 (你可能应该在你的问题中包括这个。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-29
      • 1970-01-01
      • 2014-06-20
      • 2011-04-12
      • 1970-01-01
      • 2018-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多