Python是否类似于C / C ++中的->运算符?

时间:2018-07-26 00:58:22

标签: python pass-by-reference pass-by-value

因此,在Python中,您可以执行以下操作:

def append(_list):
    _list.append(1)

_list = [0]
append(_list)
print(_list)

这显然允许我将1附加到列表中,但是,如果我在append函数中更改列表的引用,则它不会更改(这是通过传递对象引用所期望的)。 Java的工作原理相似,但是被认为是“通过引用”。

这是否仅表示Python像C ++一样,当它传递通过值指向对象然后再进行引用的指针(类似于使用C / C ++的->运算符时)?

2 个答案:

答案 0 :(得分:3)

在Python中,所有内容都是对堆的引用。在Java中,您可以使存在于堆栈上的基本类型不引用堆上的任何内容,但其他所有内容都引用堆上的对象(甚至是基本数组)。

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

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

答案 1 :(得分:-1)

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

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

因此,您可以“说” Python的属性访问.与C ++ ->类似,但这是Python的一种奇怪术语。

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