递归中的python列表

标签 python

我想找到一个div中的所有链接,例如:

<div>
  <a href="#0"></a>
  <a href="#1"></a>
  <a href="#2"></a>
</div>

所以我写了一个函数如下:

def get_links(div):
    links = []
    if div.tag == 'a':
        links.append(div)
        return links   
    else:
        for a in div:
            links + get_links(a)
        return links

为什么结果是[]而不是[a, a, a] ------ 问题

我知道这是一个列表引用的问题,你能展示一些细节吗

这是完整的模块:

import lxml.html


def get_links(div):
    links = []
    if div.tag == 'a':
        links.append(div)
        return links   
    else:
        for a in div:
            links + get_links(a)
        return links


if __name__ == '__main__':

    fragment = '''
        <div>
          <a href="#0">1</a>
          <a href="#1">2</a>
          <a href="#2">3</a>
        </div>'''
    fragment = lxml.html.fromstring(fragment)
    links = get_links(fragment)    # <---------------

最佳答案

Python 中的列表添加返回一个从参数的连接中获得的新列表,不改变它们:

x = [1, 2, 3, 4]
print(x + [5, 6])  # displays [1, 2, 3, 4, 5, 6]
print(x)           # here x is still [1, 2, 3, 4]

你可以使用extend方法:

x.extend([5, 6])

或者+=

x += [5, 6]

后者在我看来有点“奇怪”,因为在这种情况下 x=x+yx+=y 不同,因此我更喜欢避免它并使就地扩展更加明确。

为您的代码

links = links + get_links(a)

也是可以接受的,但请记住它做了不同的事情:它分配了一个带有连接的新列表,然后分配名称 links 以指向它:它不会更改原始对象由 links 引用:

x = [1, 2, 3, 4]
y = x
x = x + [5, 6]
print(x)   # displays [1, 2, 3, 4, 5, 6]
print(y)   # displays [1, 2, 3, 4]

但是

x = [1, 2, 3, 4]
y = x
x += [5, 6]
print(x)   # displays [1, 2, 3, 4, 5, 6]
print(y)   # displays [1, 2, 3, 4, 5, 6]

关于递归中的python列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27775488/

相关文章:

Python 定义一个迭代器类,失败并返回 "iter() returned non-iterator of type ' Fib'"

python - 行为: how to organize files of this framework in not-toy project

python - PySpark 数据框中的日期差异

python - 比较两个字典并在 python 中打印不相等的值

python - 从 Mongo 获取 dict 并使用 Numpy 转换为 ndarray

python - Subprocess.Popen 错误

python - forms.py 文件应位于何处?

python - 给定一个句子,返回一个单词颠倒的句子

python - Django 基于类的 View 中 self.request 和 request 的区别

python - python正则表达式中*(零次或多次)的含义