Tại sao không gọi phương thức chuỗi Python làm bất cứ điều gì trừ khi bạn gán đầu ra của nó?


136

Tôi cố gắng thực hiện thay thế chuỗi đơn giản, nhưng tôi không biết tại sao nó không hoạt động:

X = "hello world"
X.replace("hello", "goodbye")

Tôi muốn thay đổi từ hellothành goodbye, do đó nó nên thay đổi chuỗi "hello world"thành "goodbye world". Nhưng X chỉ còn lại "hello world". Tại sao mã của tôi không hoạt động?

Câu trả lời:


232

Điều này là do các chuỗi là bất biến trong Python .

Điều đó có nghĩa là X.replace("hello","goodbye")trả về một bản sao Xvới các thay thế được thực hiện . Do đó, bạn cần thay thế dòng này:

X.replace("hello", "goodbye")

với dòng này:

X = X.replace("hello", "goodbye")

Nói rộng hơn, điều này là đúng cho tất cả các phương pháp chuỗi Python mà thay đổi nội dung của một chuỗi "tại chỗ" , ví dụ như replace, strip, translate, lower/ upper, join...

Bạn phải gán đầu ra của chúng cho một cái gì đó nếu bạn muốn sử dụng nó và không vứt nó đi, vd

X  = X.strip(' \t')
X2 = X.translate(...)
Y  = X.lower()
Z  = X.upper()
A  = X.join(':')
B  = X.capitalize()
C  = X.casefold()

và như thế.


1
Điểm phạm vi: chuỗi có thể bị đột biến trong x += 'a'trường hợp đặc biệt, ví dụ stackoverflow.com/a/40996908/6260170
Chris_Rands

@Chris_Rands: Có vẻ như bạn đúng, nhưng từ bên ngoài nó không có hiệu ứng biến đổi thực sự - một số triển khai kiểm tra xem điều này có thực sự được sử dụng hay không, và nếu không (có thể quan sát được tính biến đổi) Điều đó có đúng không?
Tadeck

@Tadeck Vâng, tôi nghĩ đó là sự thật nhưng đó chỉ là tối ưu hóa CPython và không liên quan trực tiếp ở đây (đó là lý do tại sao tôi nói rằng tôi đang bị phạm tội)
Chris_Rands

0

Tất cả các chức năng chuỗi như lower, upper, stripđược trả lại một chuỗi mà không sửa đổi bản gốc. Nếu bạn cố gắng sửa đổi một chuỗi, như bạn nghĩ well it is an iterable, nó sẽ thất bại.

x = 'hello'
x[0] = 'i' #'str' object does not support item assignment

Có một cách đọc tốt về tầm quan trọng của chuỗi là bất biến: Tại sao chuỗi Python là bất biến? Thực hành tốt nhất để sử dụng chúng

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.