我想找到一个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+y
与 x+=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/