python中自定义类对象的参数传递:按引用调用或按值调用求值? [重复]

问题描述 投票:1回答:2

这个问题在这里已有答案:

当您使用列表调用'append'时,将传入列表的指针,因此原始数据会更改。

>>> tmp = [1,2]
>>> tmp.append(3)
>>> tmp
[1, 2, 3]

这是我的问题。对于下面的代码,当我将名为'head'的Node对象传递给方法'get'时,我希望在调用方法后,head会指向值为2的第二个节点。然而,事实证明'head'仍然指向值为1的第一个节点。

>>> class Node:    
        def __init__(self, val):
            self.val  = val
            self.next = None    
        def get(self, index):
            for i in range(index):
                self = self.next
            return self.val

>>> head = Node(1)
>>> head.next = Node(2)
>>> head.get(1)
2
>>> head.val
1

谁能解释为什么会这样?根据我的理解,由于Node是可变的,因此应该传入一个引用。如何知道是否传入了引用或值?提前致谢!

python parameter-passing
2个回答
0
投票

Python在进行调用时传递对象的引用值,而不是实际传递对象引用本身。在这种情况下,self只是一个局部变量,带有Node方法所绑定的get对象的引用副本,所以如果你用其他东西(在你的情况下为self)分配给self.next,那么所有发生的都是局部变量self用于保存对不同对象的引用,但self最初引用的对象以及来自调用者的对象引用保持不变。


0
投票

只是为了添加到@blhsing,你正在进行本地重新分配(与call-by-value或reference无关),你可以用以下方法验证:

a1 = [1]
def expand(a):
    a = a + [2]
    return a
a2 = expand(a1)
print(a1) # prints [1]
print(a2) # prints [1, 2]
© www.soinside.com 2019 - 2024. All rights reserved.