Python:将原始值赋给新变量,将新值赋给新变量,但原始值也会更改

55ooxyrt  于 2023-03-20  发布在  Python
关注(0)|答案(1)|浏览(158)

我正在阅读这个问题:
When does a pointer to a linked list change the actual list?
此处代码:

typclass Node:
    def __init__(self, val):
        self.val = val
        self.next = None

    def addNode(self, val):
        root = self
        while root.next is not None:
            root = root.next
        root.next = Node(val)

    def iterateLL(self):
        root = self
        print
        while root is not None:
            print(str(root.val) + " ", end="")
            root = root.next
        print()

if __name__ =="__main__":
    L = Node(1)
    L.addNode(2)
    L.addNode(3)
    L.addNode(4)

    # iterate through list and print:
    L.iterateLL()

    # changing value of pointer does not affect L
    P = L
    P = P.next
    L.iterateLL() # L is unchanged

    # changing "next" value of pointer does affect L
    P = L 
    P.next = P.next.next
    L.iterateLL() # now we've skipped node 2

    # changing data of pointer does affect L
    P = L
    P.val = 10
    L.iterateLL()e here

这里我不明白为什么当我们修改P或P上的任何动作时“L.iterateLL”的值被改变。如果它是“P.iterateLL”,那么我可以完全理解,因为P从L读取所有数据;然而,现在迭代L实际上并没有改变任何东西,从我理解P=L是P从L读取的单向引用,并没有改变L,那么为什么当我们修改P时L的数据会改变?或者这里P=L也是L=P?
先谢谢你

1zmg4dgp

1zmg4dgp1#

当你赋值P=L时,它并没有创建一个该类的新对象,它只是赋值了那个对象的地址。你可以用print(id(L), id(P))来检查。你会发现变量L和P都引用了内存中的同一个对象。因此改变P和改变L是一样的。

相关问题