這一部分首先要理解python內存機制,Python中萬物皆對象。python
對於不可變對象,改變了原來的值,其別名(變量名)綁定到了新值上面,id確定會改變app
對於可變對象,+ 操做改變了值,id確定會變,而+= 是本地操做,其值原地修改函數
對於+號操做,可變對象和不可變對象調用的都是__add__操做spa
對於+=號操做,可變對象調用__add__,不可變對象調用的是__iadd__(不可變對象沒有__iadd__) __iadd__是原地修改3d
錯誤:對象
注意:一個函數內部的任何類型的賦值都會把一個名稱劃分爲本地的。這包括=語句,import中的模塊名稱、def中的函數名稱、函數參數名稱等。若是在def中以任意方式賦值一個名稱,它都將對於該函數稱爲本地的。blog
特別注意:原處改變的對象並不會把變量劃分文本地變量,實際上,只是對變量名賦值才能夠。例如變量名L在模塊的頂層被賦值爲一個列表,在函數內部的像L.append(x)這樣的語句並不會將L劃分爲本地變量,而L=Y卻能夠。修改一個對象並非對一個名稱賦值。內存
變量名解析:LEGB原則:作用域
在函數中使用未認證的變量名時,python搜索4個做用域:本地做用域(L),以後是上一層結構中的def或者lambda本地做用域(E),以後是全局做用域(G),最後是內置做用域(B)import