这一部分首先要理解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