2010-01-29 132 views
8

在python中,字符串是否可變?該生產線someString[3] = "a"引發錯誤替換python中的字符串中的一個字符

TypeError: 'str' object does not support item assignment

我明白爲什麼(我可以寫someString [3] =「測試」,而顯然是非法的),但有沒有在Python做到這一點的方法?

+0

我有一個二進制字符串,並在一定條件下,我想翻轉特定的0到1 – Chris 2010-01-29 21:19:04

+0

但是總體來說,我想翻轉特定字母X到Y。現在我正在處理二進制字符串,但它是一個普通的查詢 – Chris 2010-01-29 21:19:36

+0

另一個提示:如果你正在做「二進制字符串」,即只包含1和0的字符串,檢查像BitVector這樣的庫,這是更快,更方便用於位矢量操作。 此外,請參閱位於Python的位向量問題http://stackoverflow.com/questions/2147848/how-do-i-represent-and-work-with-n-bit-vectors-in-python/2147873 #2147873 – 2010-01-29 21:21:42

回答

13

Python字符串是不可變的,因此它們不支持項目或切片分配。您必須使用someString[:3] + 'a' + someString[4:]或其他合適的方法構建新的字符串。

8

不是存儲您的值作爲一個字符串,你可以使用的字符列表:如果你想將其轉換回字符串,以顯示它

>>> l = list('foobar') 
>>> l[3] = 'f' 
>>> l[5] = 'n' 

然後,使用這樣的:

>>> ''.join(l) 
'foofan' 

如果您每次更改大量字符,則此方法將比每次更改字符時生成新字符串的速度快得多。

+1

我也很喜歡這個答案。萬分感謝。我需要習慣python風格的編程:) – Chris 2010-01-29 21:22:33

+0

@Chris:我強烈推薦這本書:http://www.amazon.ca/Programming-Python-Complete-Introduction-Language/dp/0137129297/ref=sr_1_6?即= UTF8&S =書籍和QID = 1264800285&SR = 8-6 – MikeyB 2010-01-29 21:25:44

2

在足夠新的蟒蛇中,您還可以使用內置bytearray類型,這是可變的。請參閱stdlib文檔。但是,「足夠新」意味着2.6或更高,所以這不一定是一種選擇。

在較老的python中,您必須創建一個新的str,如上所述,因爲這些是不可變的。這通常是最可讀的方法,但有時使用不同類型的可變序列(如字符列表,或可能是array.array)是合理的。 array.array雖然有點笨重,並且通常可以避免。

1
>>> import ctypes 
>>> s = "1234567890" 
>>> mutable = ctypes.create_string_buffer(s) 
>>> mutable[3] = "a" 
>>> print mutable.value 
123a567890