通过引用或值分配类属性?

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

参见这个 Leetcode MergeTwoSupportedList 解决方案:

class Solution(object):
    def mergeTwoLists(self, list1, list2):
        """
        :type list1: Optional[ListNode]
        :type list2: Optional[ListNode]
        :rtype: Optional[ListNode]
        """
        
        prehead = ListNode(-1)
        curr = prehead

        while list1 and list2:
            if (list1.val <= list2.val):
                curr.next = list1
                list1 = list1.next
            else:
                curr.next = list2
                list2 = list2.next
            curr = curr.next
        
        curr.next = list1 if list1 != None else list2

        return prehead.next

当我们赋值

curr.next = list1
,然后再赋值
list1 = list1.next
时,为什么
curr.next
不指向
list1.next
?根据我的理解,这些对象及其属性应该是可变的,这意味着变量赋值指向内存中的某个位置。

为了确保我正确理解变量赋值:

a = []
b = [1]
a = b
b.append(2)

print(a)
print(b)

print(id(a))
print(id(b))

在这个例子中,我们可以看到,即使我们改变 b,a == b 也是如此。上面的问题有什么不同?

python variables
1个回答
0
投票

当我们赋值

curr.next = list1
,然后再赋值
list1 = list1.next
时,为什么
curr.next
不指向
list1.next

实际上,每个 Python 变量都包含一个引用。您已完成以下操作:

  1. 复制到
    curr.next
    ,其中包含由list1
    引用的
    当前
  2. list1
    的引用替换为 1 至
    list1.next

按照这个顺序。因此,更改

list1
的值不会对
curr.next
产生任何影响。

现在,如果在“2”中你操纵了

list1
指向的内容,那么那就是一个不同的故事:你将能够通过
curr.next
看到变化。

© www.soinside.com 2019 - 2024. All rights reserved.