python---函数补充(变量传递),语句执行顺序(入栈顺序)
一:函数补充
默认作为函数参数的数据,是浅拷贝传递。不是和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]
作者:山上有风景
欢迎任何形式的转载,但请务必注明出处。
限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:使用Catalyst进行自然语言处理
· 分享一个我遇到过的“量子力学”级别的BUG。
· Linux系列:如何调试 malloc 的底层源码
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 历时 8 年,我冲上开源榜前 8 了!
· 物流快递公司核心技术能力-海量大数据处理技术
· 四大AI编程工具组合测评
· 关于能否用DeepSeek做危险的事情,DeepSeek本身给出了答案
· 如何在 Github 上获得 1000 star?