代码之家  ›  专栏  ›  技术社区  ›  MVT

Python:列表类型变为无(超出范围?)扩展insde时,在参数内创建的列表

  •  0
  • MVT  · 技术社区  · 7 年前

    我试图扩展list类,以便向列表中添加名称,后来我想创建所有列表

    所以我有以下代码: 但问题是它只适用于一个级别

    class seg(list):
        def __init__(self, value):
            self.value = value
    
    def show_hierarchy(fl,hierarchy=""):
        hierarchy += fl.value + " - "
        print(hierarchy.rstrip(" - "))
        for lists in fl:
            show_hierarchy(lists, hierarchy)
    
    # one level deep
    fl = seg("1")
    fl.extend([
        seg("1.1"),
        seg("1.2"),
        seg("1.3"),
        seg("1.4")])
    
    print(fl)
    show_hierarchy(fl)
    
    # two levels deep
    fl = seg("1")
    fl.extend([
        seg("1.1"),
        seg("1.2").extend([
            seg("1.2.1"),
            seg("1.2.2")])])
    
    print(fl)
    show_hierarchy(fl)
    

    具有以下输出:

    [[], [], [], []]
    1
    1 - 1.1
    1 - 1.2
    1 - 1.3
    1 - 1.4
    [[], None]
    1
    1 - 1.1
    

    我真的很想知道发生了什么,以及我如何解决这个问题。

    2 回复  |  直到 7 年前
        1
  •  0
  •   juanpa.arrivillaga    7 年前

    按照约定,Python容器上的mutator方法返回 None (不总是这样,请考虑 list.pop ). 当然,您可以在派生类中更改此行为,尽管我不知道这是否是一个好主意:

    In [121]: class seg(list):
         ...:     def __init__(self, value):
         ...:         self.value = value
         ...:     def extend(self, value):
         ...:         list.extend(self, value)
         ...:         return self
         ...:
    
    In [122]: fl = seg("1")
         ...: fl.extend([
         ...:     seg("1.1"),
         ...:     seg("1.2").extend([
         ...:         seg("1.2.1"),
         ...:         seg("1.2.2")])])
         ...:
    Out[122]: [[], [[], []]]
    
    In [123]: def show_hierarchy(fl,hierarchy=""):
         ...:     hierarchy += fl.value + " - "
         ...:     print(hierarchy.rstrip(" - "))
         ...:     for lists in fl:
         ...:         show_hierarchy(lists, hierarchy)
         ...:
    
    In [124]: show_hierarchy(fl)
    1
    1 - 1.1
    1 - 1.2
    1 - 1.2 - 1.2.1
    1 - 1.2 - 1.2.2
    
        2
  •  0
  •   MVT    7 年前

    最终对我起作用的是:

    class seg(list):
        def __init__(self, value):
            self.value = value
    
        def add(self, lists):
            for l in lists:
                self.append(l)
            return self
    
    # two levels deep
    fl = seg("1")
    fl.add([
        seg("1.1"),
        seg("1.2").add([
            seg("1.2.1"),
            seg("1.2.2")])])
    
    推荐文章