Giải pháp danh sách hiểu là một Pythonic nhất, nhưng, có một twist quan trọng:
mylist[:] = [s.replace(':', '') for s in mylist]
Nếu bạn gán cho mylist
, các barename, như trong câu trả lời khác, chứ không phải để mylist[:]
, "toàn bộ danh sách slice", như tôi khuyên, bạn thực sự đang làm điều gì đó rất khác với "thay thế các mục trong danh sách": bạn đang tạo danh sách mới và chỉ cần rebinding tên thanh mà bạn đã sử dụng trước đó tham khảo danh sách cũ.
Nếu danh sách cũ đó được gọi bằng nhiều tên (bao gồm cả mục nhập trong vùng chứa), việc khôi phục này không ảnh hưởng đến bất kỳ tên nào: ví dụ: nếu bạn có hàm mylist
làm đối số chỉ có hiệu lực cục bộ đối với hàm, và không thay đổi những gì người gọi thấy là nội dung của danh sách.
Gán cho lát toàn bộ danh sách, mylist[:] = ...
, làm thay đổi đối tượng danh sách hơn mucking xung quanh với các ràng buộc chuyển barenames' - bây giờ danh sách đó là sự thay đổi và không có vấn đề làm thế nào nó được gọi, giá trị mới được những gì đã thấy. Ví dụ, nếu bạn có một hàm nhận mylist
làm đối số, thì việc gán phân chia toàn bộ danh sách sẽ làm thay đổi những gì người gọi thấy dưới dạng nội dung của danh sách. Điều quan trọng là biết chính xác bạn đang sử dụng hiệu ứng gì - thông thường bạn sẽ muốn thay đổi đối tượng danh sách, vì vậy, nếu người ta phải đoán, phân bổ toàn bộ danh sách thì thường là cách tốt nhất để đoán ;-). Hiệu năng-khôn ngoan, nó không tạo ra sự khác biệt nào (ngoại trừ việc gán tên mã, nếu nó giữ cả hai đối tượng danh sách cũ và mới xung quanh, sẽ chiếm nhiều bộ nhớ hơn cho bất kỳ khoảng thời gian nào cả hai đối tượng vẫn còn xung quanh).
Nguồn
2010-06-22 15:54:53
Nó không hoạt động vì dây là không thay đổi. 're.sub' thực sự ** trả về ** một chuỗi nhưng bạn không gán nó. Đọc tài liệu: http://docs.python.org/library/re.html#re.sub –