【发布时间】:2017-01-19 08:55:14
【问题描述】:
我是一名 Python 新手程序员。我在下面看到了 leetcode 对链表的定义。我对这个概念有 2 个问题,任何帮助将不胜感激。提前致谢
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
Q1 只是想知道“self.next”的类型是什么,我知道在C++中,它应该是一个代表下一个节点地址的指针。但是python没有那个类型,所以我很困惑“next”是什么类型。
Q2 有人告诉我 next 只是一个名字。如果是这样,我运行下面的代码,
head =ListNode(1)
print sys.getsizeof(head)
head.next = ListNode(2)
print sys.getsizeof(head)
首先head.next是'None',然后分配给另一个ListNode类型, 但是在此更改之前和之后我得到了相同大小的头部,我认为头部的大小应该更大,因为它的成员之一(下一个)从 None 类型更改为 ListNode 类型。我只是对此感到困惑,非常感谢!
PS。据我了解,如果我不断向链表添加新节点,头部会越来越大,因为“嵌套”成员“下一个”越来越多,请指出我哪里出错了,谢谢。
【问题讨论】:
-
它的 python 你可以为它分配几乎任何东西,但它需要是一个
Node类型,它有一个next参数才能使列表工作。您最好为列表类创建一个add方法,而不是显式添加到.next。你可以在那里进行类型检查,或者在 python 3.5+ 中有一个类型的概念。无论如何,大小都将保持不变,因为实际节点只是一个值和对下一个节点的引用。如果您想知道有多少节点,您需要遍历列表以计算节点数,或者在添加节点时保持计数。 -
感谢您的澄清,还有一个关于引用的问题,如果引用的大小没有改变,为什么我们会有不同的大小来引用 int 和引用 list,因为在在这种情况下,它们都是引用,只是它们引用的对象不同。
-
说实话,我不能 100% 确定。但我知道虽然python中的一切都是参考。一个 int 值是一个不可变的引用,因此在分配给它时被复制(类似于在 c++ 中按值传递),但
ListNode像内置列表、dicts 等是一个可变引用,因此可以通过它传入的函数进行更改(类似于 c++ 中的非常量引用)。这种语义差异可以解释大小的差异。 This 问题可能很有趣。 -
非常感谢,您的理解对您有帮助
标签: python c++ class pointers linked-list