因此,在第一个代码中,我正在制作a.next = b。这意味着a.next和b都充当对Node6的引用。所以当我使b = None时。为什么a.next仍然指向Node6,
在第二个代码中,当我使c = a初始化时,c和a都是对Node 5的引用。现在,我使c.next = None消失,但是此更改也反映到了a上。甚至a.next也变成了None。
这两个代码都是相同的步骤,为什么更改仅反映在代码2中?
class Node:
def __init__(self, x):
self.val = x
self.next = None
a=Node(5)
b=Node(6)
a.next=b
b=None
while a is not None:
print(a.val)
a=a.next
代码2
class Node:
def __init__(self, x):
self.val = x
self.next = None
a=Node(5)
b=Node(6)
a.next=b
c=a
c.next=None
while a is not None:
print(a.val)
a=a.next
答案 0 :(得分:3)
在情况1中:列表a
在链接列表中有两个节点5和6。
但是在情况2中:列表a
和c
在链接列表中有一个节点5。 b
指向另一个链表,该链表只有6个。
希望这可以澄清您的疑问。
注意:
-由于a,b,c是存储地址的指针。当您执行c.next=None
时,由c
指向的地址(也由a
指向)的next值变成None。
答案 1 :(得分:1)
您有一个课程Node
。创建该类的对象并将其分配给变量a
或b
时,您将动态分配足够大的内存以容纳该对象的内容,然后分配地址内存中的变量。因此,代码1 确实看起来更像:
addr1 = storage address for Node(5) // Statement 1
a = addr1 // Statement 2
addr2 = storage address for Node(6) // Statement 3
b = addr2 // Statement 4
a.next = b // Statement 5
b = None // Statement 6
语句5正在使用next
的值b
更新语句1中分配的节点的addr2
属性。在语句6中,我们为b
分配了一个新值,但这不会更改存储到a
所引用的实际对象中的值。考虑下面的整数示例:
x = 5
y = 7
x = y
y = 0
设置y = 0
不会影响x = y
的先前赋值,即x仍将具有y的先前值7。您的示例的唯一区别是我们不是在处理整数,而是地址。
现在,我们感谢a
和b
确实是指向保存实际对象的内存位置(即地址)的引用,当您说c=a
时,c和a都现在引用相同的对象,可以互换使用。因此,c.next
和a.next
引用相同的属性。
答案 2 :(得分:0)
在第一种情况下,您将b
存储在a.next
中,因此在循环链接列表和头节点为a
的同时遍历所有节点。
但是在第二种情况下,c
和a
具有相同的引用,并且c.next
为None
,因此无论何时遍历链接头为{{1}的链表}您只能到达一个节点。由于c
条件不允许移动到下一个节点。
以下代码可以正常工作。
while a is not None