#對於可變類型: #+= 不會創建新對象,是在原對象上操作。 #+會創建新對象
備注:什么是可變/不可變對象
不可變對象,該對象所指向的內存中的值不能被改變。當改變某個變量時候,由於其所指的值不能被改變,相當於把原來的值復制一份后再改變,這會開辟一個新的地址,變量再指向這個新的地址。
可變對象,該對象所指向的內存中的值可以被改變。變量(准確的說是引用)改變后,實際上是其所指的值直接發生改變,並沒有發生復制行為,也沒有開辟新的出地址,通俗點說就是原地改變。
Python中,數值類型(int
和float
)、字符串str、元組tuple都是不可變類型。而列表list、字典dict、集合set是可變類型
# 一:對於列表的操作; + 運算符可以使用在列表上,+ 運算符只需要第二個操作數是可迭代的,isinstance([], Iterable)為True,列表為可迭代的
tmp = [1,2]
print("tmp 內存地址是:%s" %id(tmp))
#第一種
#tmp += [3,4]
#結論:地址未變,對於可變對象,+ 操作改變了值,id肯定會變,而+= 是本地操作,其值原地修改
# tmp 內存地址是:2939192697480
# tmp 內容是:[1, 2, 3, 4]
# tmp += 后內存地址是:2939192697480
#第二種
#結論:地址改變,對於+號操作,可變對象和不可變對象調用的都是__add__操作
#tmp = tmp + [3,4]
# tmp 內存地址是:2332801720968
# tmp 內容是:[1, 2, 3, 4]
# tmp += 后內存地址是:2332831383880
#第三種
#結論:報錯
#tmp =+ [3,4]
#TypeError: bad operand type for unary +: 'list'
print("tmp 內容是:%s" %tmp)
print("tmp += 后內存地址是:%s" %id(tmp))
#二:對於int類型,不可變變量,
sum1 =+ 1;未創建新對象;

sum1=sum1+1,+創建新對象,
sum1 +=1,創建了新對象,
對於+=號操作,可變對象調用__add__,內存地址不變
不可變對象調用的是__iadd__(不可變對象沒有__iadd__) __iadd__是原地修改,內存地址改變