对局部变量和全局变量的理解以及关于不可变对象的一些东西defChangeInt(a):...a=10...b=2ChangeInt(b)print(b)2,一个不可变对象的实例,让我很疑惑,于是我做了以下操作:defChangeInt(a):...a=10...a=2ChangeInt(a)print(a)2这实际上是很好理解,因为a=10只是一个局部变量,没有不能影响外界的return。即使我做了如下操作:defChangeInt(a):...a=10...returna...a=2ChangeInt(a)10print(a)2,改变的还是local里面的值变量,它与外面的值不同那是无关紧要的。但是当我继续:defChangeInt(a):...print(a)...a=10...print(a)...a=2ChangeInt(a)210print(a)2可以推测在函数内部,有一个过程,先将一个外部函数代入到函数内部,然后根据函数命令改变它的值;外部a仍然不受影响,所以回到第一个例子:defChangeInt(a):...a=10...b=2ChangeInt(b)print(b)2是否还有一个过程:b=2a=b=2a=10?为了验证我的猜想。..defChangeInt(a):...print(a)...a=10...print(a)...print(b)...b=2ChangeInt(a)2102print(b)2可见进程有确实是a=b=2的一个过程,然后10赋值给a(不知道为什么要把这个弄的这么复杂)。python函数中关于return的两个,以及list作为变量对象实例的例子defchangeme(mylist):...mylist.append([1,2,3,4])...return...mylist=[1,2]changeme(mylist)mylist[1,2,[1,2,3,4]]只返回结束函数,不返回任何值列表作为变量对象实例,无论是否返回结果,其值在函数内外是统一的,即函数外的值在函数内被修改后也会受到影响。例如:defnano(myint):...myint+=2...return...myint=3nano(myint)myint3另一个例子:defnano(myint):...myint+=2...returnmyint...myint=3nano(myint)5myint3从上面两个例子可以看出,函数中返回具体对象时,调用函数直接返回返回对象的值,int等不可变对象是在函数中。只传递了a的值,a对象本身不受影响。修改内部fun的值只是修改另一个复制的对象。不可变对象存储和可变对象存储空间的三个区别一个神奇的现象:x=1y=1x为yTrue查看xy存储地址print(hex(id(x)))0x7fff442d7100print(hex(id(y)))0x7fff442d7100可以是发现他们的存储地址是一样的,即这个1同时赋给了x和yx="a"y="a"x是yTrueprint(hex(id(x)))0x2093ab6fbb0print(hex(id(y)))0x2093ab6fbb0字符串也是如此,但是当我们将对象改为可编辑列表时:a=[1,2,3]b=[1,2,3]aisbFalseprint(hex(id(a)))0x2093ab97d88print(hex(id(b)))0x2093add17c8可以发现即使列表内容相同,两者的存储地址还是不同的。因为a和b是可以改变的。而xy指向同一个值,不需要每次赋值都开辟一个存储空间,只需要将变量指向已有的值即可;对于列表,需要给每个列表一个存储空间,以适应每个列表都会变化的特点。本质上,前者(int,string)在函数中复制了一个对象;而后者(list,set)在函数中仍然指向原来的存储地址。关于我是如何让自己头晕的:)
