Python 为什么在类方法中创建类的实例会改变';自我';论点
我正在用Python编写一个链表,我遇到了一个问题,这个问题对于调试来说非常麻烦和可怕,我觉得我遗漏了Python的一些东西。我应该创建一个带有一些基本功能的单链表。其中一个是take()函数,该函数用于创建原始列表中n个元素的新列表。 但是,创建LinkedList类的新实例似乎会更改.self参数,并且变量节点会被修改为属性。next将变为None。结果,当创建一个列表,然后尝试从其中的n个元素中创建一个新的列表时,程序会无限期运行,但无论我查看哪个部分,我都找不到循环或其背后的原因Python 为什么在类方法中创建类的实例会改变';自我';论点,python,list,linked-list,Python,List,Linked List,我正在用Python编写一个链表,我遇到了一个问题,这个问题对于调试来说非常麻烦和可怕,我觉得我遗漏了Python的一些东西。我应该创建一个带有一些基本功能的单链表。其中一个是take()函数,该函数用于创建原始列表中n个元素的新列表。 但是,创建LinkedList类的新实例似乎会更改.self参数,并且变量节点会被修改为属性。next将变为None。结果,当创建一个列表,然后尝试从其中的n个元素中创建一个新的列表时,程序会无限期运行,但无论我查看哪个部分,我都找不到循环或其背后的原因 cla
class LinkedList:
def __init__(self, head=None):
self.head = head
def is_empty(self):
if self.head == None:
return True
else:
return False
def add_last(self, node):
if self.is_empty():
self.head = node
return
nextEl = self.head
while True:
if nextEl.next is None:
nextEl.next = node
return
nextEl = nextEl.next
def take(self, n):
node = self.head
newHead = self.head
newHead.next = None
newList = LinkedList(newHead)
count = 0
while count < n:
newList.add_last(node.next)
node = node.next
count += 1
return newList
class Node:
def __init__(self, data, next=None):
self.data = data
self.next = next
类链接列表:
def uuu init uuu(self,head=None):
self.head=头
def为空(自身):
如果self.head==无:
返回真值
其他:
返回错误
def add_last(自身,节点):
如果self.is_为空():
self.head=节点
返回
nextEl=self.head
尽管如此:
如果nextEl.next为无:
nextEl.next=node
返回
nextEl=nextEl.next
def接收(自身,n):
node=self.head
newHead=self.head
newHead.next=无
newList=链接列表(newHead)
计数=0
当计数
谢谢您的帮助。在take()
函数行中
newHead.next = None
修改链接列表的一个节点,打断此列表。您可以按如下方式修复此问题:
def take(self, n):
node = self.head
newHead = Node(self.head.data)
newList = LinkedList(newHead)
count = 0
while count < n:
newList.add_last(node.next)
node = node.next
count += 1
return newList
还有更多的问题。例如,
take(sefl,n)
实际上会创建一个包含n+1
元素的列表,如果将其应用于没有那么多元素的链接列表,则会引发异常。newHead=self。head
不会创建新的head。它在self.head
处将相同的对象分配给变量newHead
。因此,您的新链表,LinkedList(newHead)
是使用与旧链表共享的节点创建的
def add_last(self, node):
if self.is_empty():
self.head = node
return
nextEl = self.head
while True:
if nextEl.next is None:
nextEl.next = Node(node.data)
return
nextEl = nextEl.next