For循环中的Python列表

sto*_*rap 5 python string loops list

我是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
Run Code Online (Sandbox Code Playgroud)

我使用第一个for循环来检查语法是否正确,并且它工作正常.但第二个for循环是我想要使用的代码,但它无法正常工作.如何使用第二个for循环全局更新列表,以便我可以在for循环之外打印或存储更新的列表?

Ash*_*ary 7

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

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

另一种方法是使用列表理解:

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]
Run Code Online (Sandbox Code Playgroud)

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'
Run Code Online (Sandbox Code Playgroud)

另请注意,str.replace始终返回一个新的字符串副本,它永远不会更改原始字符串,因为字符串在Python中是不可变的.如果lis[0]是一个列表,并使用你上执行任何就地操作.append,.extend等等,那么这将有原来的名单受到影响.

  • @JimmyKane`urls [:]`表示将`urls`列表中的所有项替换为RHS上的iterable项.这与简单的`urls = [...]`不同.如果他有'a = b = [1,2,3]`之类的东西,然后我们用'b [:] = [x**2代表b中的x],那么这将影响'a`和`B`. (2认同)