python中的 += 與 +

知其然,知其所以然。發表於2017-10-10

這一部分首先要理解python記憶體機制,Python中萬物皆物件。

對於不可變物件,改變了原來的值,其別名(變數名)繫結到了新值上面,id肯定會改變

     

對於可變物件,+ 操作改變了值,id肯定會變,而+= 是本地操作,其值原地修改

對於+號操作,可變物件和不可變物件呼叫的都是__add__操作

對於+=號操作,可變物件呼叫__add__,不可變物件呼叫的是__iadd__(不可變物件沒有__iadd__)   __iadd__是原地修改

 

 

錯誤:

注意:一個函式內部的任何型別的賦值都會把一個名稱劃分為本地的。這包括=語句,import中的模組名稱、def中的函式名稱、函式引數名稱等。如果在def中以任意方式賦值一個名稱,它都將對於該函式稱為本地的。

特別注意:原處改變的物件並不會把變數劃分文字地變數,實際上,只是對變數名賦值才可以。例如變數名L在模組的頂層被賦值為一個列表,在函式內部的像L.append(x)這樣的語句並不會將L劃分為本地變數,而L=Y卻可以。修改一個物件並不是對一個名稱賦值。

變數名解析:LEGB原則:

在函式中使用未認證的變數名時,python搜尋4個作用域:本地作用域(L),之後是上一層結構中的def或者lambda本地作用域(E),之後是全域性作用域(G),最後是內建作用域(B)

 

相關文章