For循环中的Python列表

For循环中的Python列表,python,string,list,loops,Python,String,List,Loops,我是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/

我是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循环全局更新列表,以便在for循环之外打印或存储更新后的列表?

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

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]
这里的
url[:]
意味着用列表创建的新列表替换
url
列表的所有项目

代码不起作用的原因是您正在将变量
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
等对其执行了任何就地操作,那么这也会影响原始列表。

谢谢,我发现这也很有帮助。我是新手,来这里做一些研究:-)在我的研究中,我想我在你的代码中发现了一个小错误
returns.url.replace('javascript:l(“,”).replace(“,”),'-Texas.html')
--应该是--
returns.replace('javascript:l(“,”).replace(“,”),'-Texas.html')
@Darren Nice catch,修复了这个问题。:-)替换为列表理解时是否需要
URL[:]
?它不会返回一个新列表吗?@JimmyKane
url[:]
意味着将
url
列表中的所有项目替换为RHS上iterable中的项目。这与简单的
URL=[…]
不同。如果他有类似于
a=b=[1,2,3]
,然后我们使用
b[:]=[x**2代表b中的x]
,那么这将同时影响
a
b