元組tuple修改問題 操作

2021-09-25 23:58:39 字數 1615 閱讀 7560

最近在看wtfpython——一些奇怪的python特性,發現了一些以前不曾意識到的問題(大概是自己太菜了吧,hhh),這裡就列舉了乙個元組能不能修改。雖然元組的定義是不可改變的,但慢慢看完文章,你會有新發現的

看下下面這個問題

>>> some_tuple = ([1],[2],[3])

>>> some_tuple[0] += [2]

traceback (most recent call last):

file "", line 1, in typeerror: 'tuple' object does not support item assignment

>>> some_tuple

([1, 2], [2], [3])

>>> some_tuple[0] = [2]

traceback (most recent call last):

file "", line 1, in typeerror: 'tuple' object does not support item assignment

>>> some_tuple

([1, 2], [2], [3])

沒錯,tuple確實被修改了,雖然是丟擲了異常,但下面有個例子不會丟擲異常修改元組

不可變序列 不可變序列的物件一旦建立就不能再改變. (如果物件包含對其他物件的引用,則這些其他物件可能是可變的並且可能會被修改; 但是,由不可變物件直接引用的物件集合不能更改.)

沒錯,不可變的tuple確實報了錯(tuple不支援修改),但是使用+=時,確實改變了tuple

+=回原地修改可變物件,而tuple中+=是兩個過程,先+再=,所以+操作時已經修改了原物件,但是再次賦值就觸犯了元組不能修改規則,丟擲異常

首先需要重溫+=這個運算子,如a+=b:

對於可變物件(mutable object)如list, +=操作的結果會直接在a對應的變數進行修改,而a對應的位址不變.

對於不可變物件(imutable object)如tuple, +=則是等價於a = a+b 會產生新的變數,然後繫結到a上而已.

參考這個:python中tuple+=賦值的四個問題

>>> a = some_tuple[0]

>>> id(a)

1833459936

>>> a += [3]

>>> a

[1, 2, 3]

>>> id(a)

1833459936

>>> some_tuple

([1, 2, 3], [2], [3])

>>> id(some_tuple[0])

1833459936

所以元組到底可不可變?從上面可以看到tuple不支援=這種assign操作,但是對其中可變元素的原地修改是可以的

+=, -=, =, /=, //=, %=, *=, <<=, >>=, &=, ^=, |=這些操作符都是原地修改可變物件,不會改變物件

所以,tuple元組的不可變是指元素物件的引用不可變,不能對其再次賦值,但是在其中可變元素物件的引用不被修改前提下,仍舊可以對可變元素物件修改

python 元組操作 tuple

建立元組 1 建立空元組tup print format tup,type tup 2 建立只帶乙個元素的元組,在後邊新增乙個逗號tup 1 元組中只有乙個元素時,在元素後面加上逗號,否則會被當成其他資料型別處理 print format tup,type tup 使用type 檢視變數型別.1,3...

python教程 元組tuple操作

元組也是一種序列,元組中的值不能被改變,它與列表非常相像,它就像是乙個常量列表。使用元組的原因與場景 1 元組占用空間比列表小 2 元組的值不會被意外改變 3 可以將元組用於字典的鍵 4 命名元組可以作為物件的替代 5 函式的引數是以元組進行傳遞的 元組不能增刪改,但可以查 列表通過方括號來定義,元...

元組(tuple)的常用操作

修改元組元素 元組的拆包 元組推導式 列表和元祖的區別 元組的定義由 定義,相鄰元素之間採用,進行分割,在形式上,可以稱為不可變的列表 元組是不可變型別,無法對其中的元素進行單獨的修改和增加 空元祖的建立 tu 乙個元素的元組的建立的時候,需要在元素末尾加個,tu1 hello world 多種資料...