Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么在类方法中创建类的实例会改变';自我';论点_Python_List_Linked List - Fatal编程技术网

Python 为什么在类方法中创建类的实例会改变';自我';论点

Python 为什么在类方法中创建类的实例会改变';自我';论点,python,list,linked-list,Python,List,Linked List,我正在用Python编写一个链表,我遇到了一个问题,这个问题对于调试来说非常麻烦和可怕,我觉得我遗漏了Python的一些东西。我应该创建一个带有一些基本功能的单链表。其中一个是take()函数,该函数用于创建原始列表中n个元素的新列表。 但是,创建LinkedList类的新实例似乎会更改.self参数,并且变量节点会被修改为属性。next将变为None。结果,当创建一个列表,然后尝试从其中的n个元素中创建一个新的列表时,程序会无限期运行,但无论我查看哪个部分,我都找不到循环或其背后的原因 cla

我正在用Python编写一个链表,我遇到了一个问题,这个问题对于调试来说非常麻烦和可怕,我觉得我遗漏了Python的一些东西。我应该创建一个带有一些基本功能的单链表。其中一个是take()函数,该函数用于创建原始列表中n个元素的新列表。 但是,创建LinkedList类的新实例似乎会更改.self参数,并且变量节点会被修改为属性。next将变为None。结果,当创建一个列表,然后尝试从其中的n个元素中创建一个新的列表时,程序会无限期运行,但无论我查看哪个部分,我都找不到循环或其背后的原因

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