这个问题在这里已有答案:
当您使用列表调用'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在进行调用时传递对象的引用值,而不是实际传递对象引用本身。在这种情况下,self
只是一个局部变量,带有Node
方法所绑定的get
对象的引用副本,所以如果你用其他东西(在你的情况下为self
)分配给self.next
,那么所有发生的都是局部变量self
用于保存对不同对象的引用,但self
最初引用的对象以及来自调用者的对象引用保持不变。
只是为了添加到@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]