2011-12-30 19 views
35
  1. Lý do thiết kế khiến các chuỗi Python không thay đổi được là gì? Làm thế nào để nó làm cho chương trình dễ dàng hơn?
  2. Tôi đã quen với các chuỗi có thể thay đổi, giống như các chuỗi trong C. Làm cách nào tôi có thể lập trình mà không có chuỗi có thể thay đổi? Có bất kỳ thực hành tốt nhất nào không?
+1

Có loại chuỗi có thể thay đổi được, nó được gọi là ['bytearray'] (http://docs.python.org/library/functions.html#bytearray) –

+5

@JanneKarila: Ngữ nghĩa, tuy nhiên, khác nhau rất khác nhau. Nó không, ví dụ, xử lý các ký tự Unicode, chỉ cần byte. Nó không phải là một chuỗi thích hợp - với các phương thức chuỗi - đó là một mảng có thể điều chỉnh các byte. –

Trả lời

37

Khi bạn nhận được một chuỗi, bạn sẽ chắc chắn rằng nó vẫn như cũ. Giả sử bạn muốn xây dựng một số Foo như bên dưới với đối số chuỗi và sau đó sửa đổi chuỗi; sau đó tên Foo 's sẽ đột nhiên thay đổi:

class Foo(object): 
    def __init__(self, name): 
     self.name = name 

name = "Hello" 
foo = Foo(name) 
name[0] = "J" 

Với chuỗi có thể thay đổi, bạn sẽ phải sao chép tất cả các thời gian để ngăn chặn những điều xấu xảy ra.

Nó cũng cho phép sự tiện lợi mà một ký tự đơn không khác với một chuỗi có độ dài một, vì vậy tất cả các toán tử chuỗi cũng áp dụng cho các ký tự.

Và cuối cùng, nếu chuỗi không thay đổi, bạn không thể sử dụng chúng một cách đáng tin cậy làm khóa trong một dict, vì giá trị băm của chúng có thể đột nhiên thay đổi.

Đối với lập trình bằng các chuỗi không thay đổi, chỉ được sử dụng để xử lý chúng giống như cách bạn xử lý các số: như giá trị, không phải là đối tượng. Thay đổi chữ cái đầu tiên của name sẽ

name = "J" + name[1:] 
+3

Sooooooo Tôi biết điều này hơi trễ một chút, nhưng bạn có thể giải thích những gì bạn có ý nghĩa bằng các chuỗi có thể thay đổi không đáng tin cậy trong các đoạn không? Danh sách có thể thay đổi, nhưng có thể được đặt trong dicts, những gì sẽ làm cho chuỗi mutable 'không đáng tin cậy'? – wnnmaw

+6

@wnnmaw Những gì larsmans có nghĩa là bạn sẽ không thể sử dụng một cách đáng tin cậy các chuỗi như chìa khóa cho một dict, vì việc sửa đổi một chuỗi sẽ thay đổi giá trị băm của nó, điều này sẽ thay đổi chuỗi mà chuỗi sẽ chuyển đến. Bạn có thể xem danh sách này với chính danh sách bằng cách cố gắng sử dụng danh sách làm khóa cho từ điển ('a = {}; a [[1,2]] = 1' ném một' LoạiError'). –

2

Chuỗi không thể thay đổi giúp lập trình dễ dàng hơn nhiều, đó là lý do tại sao C# và Java cũng sử dụng chúng.

Có chuỗi có thể thay đổi được, bạn sẽ không thể tin tưởng bất kỳ chuỗi được cung cấp bên ngoài nào, vì người gọi độc hại có thể thay đổi nó bên dưới bạn.
Điều này cũng khiến cho việc đa luồng trở nên khó khăn hơn nhiều.

3

Hầu hết các ngôn ngữ đều có chuỗi không thay đổi. Điều này bao gồm Java, Python và C#. Thông thường khi nối chuỗi, ngôn ngữ phân bổ một chuỗi hoàn toàn mới và sao chép nội dung của hai chuỗi vào chuỗi mới.

Tính không thay đổi có xu hướng giúp lập trình dễ dàng hơn. Đặc biệt là khi giao dịch với môi trường đa luồng.

5
  1. Các đối tượng không thể thay đổi được tự động an toàn.
  2. Bạn sẽ tìm thấy rằng việc sử dụng chuỗi Python là trivially dễ dàng hơn so với những đau đớn cùng cực gắn liền với chuỗi trong C.
5

chuỗi bất biến rất đơn giản hóa cấp phát bộ nhớ khi so sánh với chuỗi C: bạn không đoán tại một chiều dài và quá mức phân bổ hy vọng bạn quá phân bổ đủ.

Họ an toàn hơn: bạn có thể không bao giờ có một bộ đệm tràn ngập cách bạn có thể trong C.

Chỉ có một trường hợp chuỗi sử dụng có thể thay đổi.

  • thay thế một chuỗi hoặc một ký tự đơn

Tất cả trường hợp chuỗi sử dụng khác (nối, tìm kiếm, vv, vv) các mutability không quan trọng. Trong tất cả các trường hợp khác, sự biến đổi không quan trọng.

Nếu bạn muốn thay thế một nhân vật hoặc một chuỗi con bằng Python, bạn chỉ cần tạo một chuỗi mới

x = x[:place] + replacement + x[place+1:] 

Đó là mã duy nhất mà cuốn tiểu thuyết hay phân biệt.


Vì lý do tôi không hiểu, điều quan trọng là phải thêm những điều sau đây.

"Có nhiều cách khác để tránh tràn bộ đệm chuỗi so với chuỗi không thay đổi".

Vì mục đích của câu hỏi này (về Python, cụ thể) các chuỗi không thay đổi có kết quả dễ chịu không có tràn bộ đệm. Đối với các ngôn ngữ khác, các nguyên tắc, quy tắc và sắc thái khác được áp dụng.

+2

Ruby (như một ví dụ) có các chuỗi có thể thay đổi, và nó có quản lý bộ nhớ tự động và không thể có tràn bộ đệm. Đối với việc thay thế các chất nền là trường hợp sử dụng duy nhất, những gì về (tại chỗ) gắn thêm? -1 – delnan

+0

Không có "bổ sung tại chỗ". Đó chỉ là phụ thêm. 'x = x + y'. Hoặc 'x + = y'. Bạn không thể biết được nó được đặt tại chỗ hay được thực hiện với các chuỗi không thay đổi được. –

+0

@delnan: Ruby? Đó không phải là một phần của câu hỏi này. –

5

Chuỗi không thể thay đổi có thể là các khóa trong từ điển và cấu trúc dữ liệu tương tự, mà không cần sao chép chuỗi. Nó dễ dàng hơn để làm cho một wrapper mutable xung quanh một chuỗi bất biến hơn so với cách khác xung quanh.

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