2014-01-30 7 views
5

저는 파이썬을 처음 접했고 for 루프를 사용하여리스트를 업데이트하는 것에 대해 질문이있었습니다. 여기 내 코드는 다음과 같습니다.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 루프를 사용하여 목록을 전역 적으로 업데이트하는 방법은 무엇입니까?

답변

7

당신은 자신의 인덱스를 사용하여 목록 항목을 업데이트 할 수 있습니다

다음
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 목록의 모든 항목을 대체 : 또 다른 대안은 지능형리스트를 사용하는 것입니다

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

목록 이해력에 의해 생성 된 목록.

코드가 작동하지 않는 이유는 변수 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 항상 문자열의 새 복사본을 반환합니다 그것은 결코 문자열을 파이썬에서 불변이기 때문에 원래 문자열을 변경하지 :에 그래서, 당신의 코드는 동일합니다. lis[0]이 목록이었고 .append, .extend 등을 사용하여 내부 조작을 수행 한 경우 원래 목록에도 영향을 미쳤을 것입니다.

+0

감사합니다.이 역시 도움이됩니다. 나는 초보자이며 공부하기 위해 이렇게 왔습니다 :-) 제 연구에서 당신의 코드에 약간의 오류가 있다고 생각합니다. 'return s.replace ('javascript : (' ',' ')); return s.url.replace ('javascript : : l (" ',' '). replace ('"); ', Texas.html') ' –

+0

@Darren 좋은 캐치가 고정되었습니다. :-) –

+0

은리스트 이해력으로 대체 할 때'urls [:]'이 필요합니까? 새 목록을 반환하지 않습니까? –