เหตุใดจึงไม่เรียกเมธอดสตริง Python ทำอะไรเลยเว้นแต่คุณจะกำหนดเอาต์พุต


137

ฉันพยายามเปลี่ยนสตริงง่ายๆ แต่ไม่รู้ว่าทำไมดูเหมือนจะใช้ไม่ได้:

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

ฉันต้องการที่จะเปลี่ยนคำhelloไปgoodbyeดังนั้นจึงควรเปลี่ยนสายไป"hello world" "goodbye world"แต่ X "hello world"เพียงซาก เหตุใดรหัสของฉันจึงไม่ทำงาน

คำตอบ:


234

นี้เป็นเพราะสายจะไม่เปลี่ยนรูปในหลาม

ซึ่งหมายความว่าX.replace("hello","goodbye")ผลตอบแทนที่ได้สำเนาXที่มีการเปลี่ยนที่ทำ ด้วยเหตุนี้คุณจึงต้องแทนที่บรรทัดนี้:

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

ด้วยบรรทัดนี้:

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

กว้างกว่านี้เป็นจริงสำหรับทุกวิธีสตริงหลามที่มีการเปลี่ยนแปลงเนื้อหาของสตริง "ในสถานที่"เช่นreplace, strip, translate, lower/ upper, join...

คุณต้องกำหนดผลลัพธ์ให้กับบางสิ่งหากคุณต้องการใช้และไม่ทิ้งมันไปเช่น

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

และอื่น ๆ


1
Pedantic point: สตริงสามารถกลายพันธุ์ได้สำหรับx += 'a'กรณีพิเศษเช่นstackoverflow.com/a/40996908/6260170
Chris_Rands

@Chris_Rands: ดูเหมือนว่าคุณจะพูดถูก แต่จากภายนอกมันไม่มีเอฟเฟกต์การเปลี่ยนแปลงที่แท้จริง - การใช้งานบางอย่างตรวจสอบว่ามีการใช้งานจริงหรือไม่และถ้าไม่ (จะไม่สังเกตเห็นความสามารถในการเปลี่ยนแปลงได้) มันจะกลายพันธุ์ เป็นเช่นนั้นจริงหรือ?
Tadeck

@Tadeck ดีฉันคิดว่ามันเป็นจริงแต่มันก็เป็นเพียงการเพิ่มประสิทธิภาพ CPython และไม่เกี่ยวข้องโดยตรงที่นี่ (นั่นเป็นเหตุผลที่ผมบอกว่าผมถูกอวดความรู้)
Chris_Rands

0

ทุกฟังก์ชั่นสตริงlower, upper, stripจะกลับสตริงโดยไม่ต้องแก้ไขต้นฉบับ หากคุณพยายามแก้ไขสตริงอย่างที่คุณคิดว่าwell it is an iterableจะล้มเหลว

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

มีการอ่านที่ดีเกี่ยวกับความสำคัญของสตริงที่ไม่เปลี่ยนรูป: ทำไมสตริง Python จึงไม่เปลี่ยนรูป? แนวทางปฏิบัติที่ดีที่สุดสำหรับการใช้งาน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.