一:函数补充
默认作为函数参数的数据,是浅拷贝传递。不是和C等语言一样,产生一个临时变量。
class T: def __init__(self,num): print(id(num)) self.num = num print(id(self.num)) def printf(self): num = self.num print(id(num)) #数据没有被改变过,所以这里的所有相关num变量都是指向同一个内存空间 if __name__ == "__main__": num = 10 print(id(num)) t = T(num) t.printf()
1385649216 1385649216 1385649216 1385649216
由输出结果可以知道,这些变量引用的都是同一个内存空间的值。属于浅拷贝。只有当我们在函数中去修改该变量的时候,才会重新去生成一个局部变量内存空间去存放数据,当函数执行后,数据被回收。
def func(num): print(id(num),num) num = 13 #修改数据,分配新的局部变量空间,函数退出,被回收 print(id(num),num) if __name__ == "__main__": n = 12 print(id(n),n) func(n) print(id(n),n) print("end")
1385649280 12 1385649280 12 1385649312 13 #此时被修改了数据,内存中为这个局部变量重新分配了空间,修改不影响原来的数据 1385649280 12 end
注意:当列表,字典等类型传入函数体后,修改不会改变内存地址,同样传递对象的结果一样,修改后不会改变内存地址
>>> class T: ... pass ... >>> t = T >>> t = T() >>> t <__main__.T object at 0x0000000001091588> >>> t.id = 6 >>> t <__main__.T object at 0x0000000001091588> >>> t.age = "daf" >>> t <__main__.T object at 0x0000000001091588>
二:语句中的入栈顺序
同其他语言(C,C++等)一样入栈顺序是右端先进行执行后入栈(python3.5中),在python2.7之前的入栈顺序是左端先
Python2.7:
Python 2.7.10 (default, May 23 2015, 09:44:00) [MSC v.1500 64 bit (AMD64)] on wi
n32
Type "help", "copyright", "credits" or "license" for more information.
>>> ls = [1,2,3]
>>> print ls,ls.reverse() #print先入栈执行,然后reverse再入栈执行
[1, 2, 3] None
>>> print ls
[3, 2, 1]
Python3.5:
Python 3.5.4 (v3.5.4:3f56838, Aug 8 2017, 02:17:05) [MSC v.1900 64 bit (AMD64)]
on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> li = [4,3]
>>> print(li,li.reverse()) #右端先入栈执行reverse,再输出li,li.reverse()的结果None
[3, 4] None
>>> print(li)
[3, 4]