2010-11-19 32 views
5

Chỉ cần tò mò hơn bất cứ điều gì tại sao python sẽ cho phép tôi cập nhật một lát của một danh sách nhưng không phải là một chuỗi?Tại sao tôi có thể cập nhật một lát danh sách chứ không phải một lát chuỗi trong python?

>>> s = "abc" 
>>> s[1:2] 
'b' 
>>> s[1:3] 
'bc' 
>>> s[1:3] = "aa" 

>>> l = [1,2,3] 
>>> l[1:3] 
[2, 3] 
>>> l[1:3] = [9,0] 
>>> l 
[1, 9, 0] 

Có lý do chính đáng cho việc này không? (Tôi chắc chắn có.)

+0

"Có lý do chính đáng cho việc này không?" Vâng. Chuỗi không phải là danh sách. Nghiêm túc, đó là lý do. Họ làm việc khác nhau. –

Trả lời

5

Python phân biệt các loại dữ liệu có thể thay đổi và không thay đổi được. Làm dây bất biến là một quyết định thiết kế chung trong Python. Số nguyên không thay đổi, bạn không thể thay đổi giá trị của 42. Các chuỗi cũng được xem là giá trị bằng Python, vì vậy bạn không thể thay đổi "fourty-two" thành một số thứ khác.

Quyết định thiết kế này cho phép một số tối ưu hóa. Ví dụ, nếu một chuỗi hoạt động không thay đổi giá trị của một chuỗi, CPython thường chỉ trả về chuỗi gốc. Nếu chuỗi có thể thay đổi được, nó sẽ luôn luôn là cần thiết để tạo một bản sao.

9

Bởi vì trong trăn, dây là immutable.

+0

+1. Điều này đúng trong nhiều ngôn ngữ lập trình (trong đó cung cấp một chuỗi thực hiện) –

+0

Điểm tuyệt vời, tôi hoàn toàn quên về khía cạnh này của chuỗi python. Xin lỗi vì đã lãng phí thời gian. – Chris

+0

Đừng đánh bại bản thân. Thêm vào đó, nó có thể giúp người tiếp theo tình cờ gặp phải câu hỏi này :) –

Các vấn đề liên quan