Python中的For循环中的列表

5

我刚接触Python,对使用for循环更新列表有疑问。这是我的代码:

urls = ['http://www.city-data.com/city/javascript:l("Abbott");' , 'http://www.city-data.com/city/javascript:l("Abernathy");' ,

'http://www.city-data.com/city/Abilene-Texas.html' ,'http://www.city-data.com/city/javascript:l("Abram-Perezville");' ,  

'http://www.city-data.com/city/javascript:l("Ackerly");' , 'http://www.city-data.com/city/javascript:l("Adamsville");', 

'http://www.city-data.com/city/Addison-Texas.html']

for url in urls:
    if "javascript" in url:
        print url
        url = url.replace('javascript:l("','').replace('");','-Texas.html')
        print url

for url in urls:
    if "javascript" in url:
        url = url.replace('javascript:l("','').replace('");','-Texas.html')
print "\n"  
print urls

我用第一个for循环检查语法是否正确,这个循环工作得很好。但是第二个for循环是我想使用的代码,但它没有正常工作。我该如何全局更新列表并在for循环之外打印或存储更新后的列表?

1个回答

7

您可以使用它们的索引更新列表项:

for i, url in enumerate(urls):
    if "javascript" in url:
        urls[i] = url.replace('javascript:l("','').replace('");','-Texas.html')

另一种选择是使用列表推导式:

def my_replace(s):
    return s.replace('javascript:l("','').replace('");','-Texas.html')

urls[:] = [my_replace(url) if "javascript" in url else url for url in urls]

这里的urls[:]表示用列表推导式创建的新列表替换urls列表中的所有项目。
你的代码之所以不起作用是因为你将变量url赋值给了其他内容,而更改对象的一个引用以指向其他内容并不会影响其他引用。所以,你的代码等效于:
>>> lis = ['aa', 'bb', 'cc']
>>> url = lis[0]                   #create new reference to 'aa'
>>> url = lis[0].replace('a', 'd') #now assign url to a new string that was returned by `lis[0].replace`
>>> url 
'dd'
>>> lis[0]
'aa'

同时需要注意的是,str.replace总是返回一个新的字符串副本,它永远不会更改原始字符串,因为Python中的字符串是不可变的。如果lis[0]是一个列表,并且使用.append.extend等进行任何原地操作,那么它也将影响原始列表。


谢谢,我也觉得这很有帮助。我是新手,来 Stack Overflow 学习 :) 在我的学习中,我认为在你的代码中发现了一个小错误。return s.url.replace('javascript:l("','').replace('");','-Texas.html') -- 应该是 -- return s.replace('javascript:l("','').replace('");','-Texas.html') - Darren Haynes
@Darren 很好的发现,已经修复了。 :-) - Ashwini Chaudhary
使用列表推导式替换时,是否需要使用urls[:]?它不会返回一个新的列表吗? - Jimmy Kane
2
@JimmyKane urls[:] 的意思是用右侧可迭代对象的所有元素替换 urls 列表中的所有元素。这与简单的 urls = [...] 不同。如果他有类似 a = b = [1, 2, 3] 的东西,然后我们使用 b[:] = [x**2 for x in b],那么这将影响到 ab 两个变量。 - Ashwini Chaudhary

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接