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 =
print(id(num))
t = T(num)
t.printf()
由输出结果可以知道,这些变量引用的都是同一个内存空间的值。属于浅拷贝。只有当我们在函数中去修改该变量的时候,才会重新去生成一个局部变量内存空间去存放数据,当函数执行后,数据被回收。
def func(num):
print(id(num),num)
num = 13 #修改数据,分配新的局部变量空间,函数退出,被回收
print(id(num),num) if __name__ == "__main__":
n =
print(id(n),n)
func(n)
print(id(n),n)
print("end")
13 #此时被修改了数据,内存中为这个局部变量重新分配了空间,修改不影响原来的数据 end
注意:当列表,字典等类型传入函数体后,修改不会改变内存地址,同样传递对象的结果一样,修改后不会改变内存地址
>>> class T:
... pass
...
>>> t = T
>>> t = T()
>>> t
<__main__.T object at 0x0000000001091588>
>>> t.id =
>>> 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]
python---函数补充(变量传递),语句执行顺序(入栈顺序)的更多相关文章
- python函数对变量的作用及遵循的原则
1.全局变量和局部变量 全局变量:指在函数之外定义的变量,一般没有缩进,在程序执行的全过程有效 局部变量:指在函数内部使用的变量,仅在函数内部有效,当函数退出时变量将不存在 例如: n=1 #n是全局 ...
- 函数调用过程中,函数参数的入栈顺序,why?
C语言函数参数入栈顺序为从右至左.具体原因为:C方式参数入栈顺序(从右至左)的好处就是可以动态变化参数个数.通过栈堆分析可知,自左向右的入栈方式,最前面的参数被压在栈底.除非知道参数个数,否则是无法通 ...
- 测试当前C环境的栈帧增长方向以及传递参数时的压栈顺序
前文链接:上次由于一个很常见的printf-bug(下文有提及)引发了我对栈的思考,并写下了一点总结.这次就尝试对不同的C环境进行实践,检测其传递参数的一些性质. 这是今天写的检查C环境的一段程序.能 ...
- c++参数入栈顺序和参数计算顺序
关于 本文涉及到代码,演示环境为:win10 + VS2017 ,ubuntu+clang clang版本: 参数入栈顺序 顺序 几种常见的函数参数入栈顺序,还有两种就不介绍了(__clrcall._ ...
- C中入栈顺序和运算顺序有关系吗?
如下代码会怎么执行? printf( "%c,%c,%c\n", getchar(), getchar(), getchar() ); 实际测试,是倒序执行,感觉上符合“C函数的形 ...
- n个元素的入栈顺序有多少种出栈顺序?
问题:w1.w2.w3.w4.w5,5个元素将会按顺序入栈,求出栈顺序有多少种情况. 先写一下结论方便记忆: 1个元素:1种 2个元素:2种 3个元素:5种 4个元素:14种 5个元素:42种 简单的 ...
- python 函数及变量作用域及装饰器decorator @详解
一.函数及变量的作用 在python程序中,函数都会创建一个新的作用域,又称为命名空间,当函数遇到变量时,Python就会到该函数的命名空间来寻找变量,因为Python一切都是对象,而在命名空间中 ...
- python 函数参数的传递(参数带星号的说明) 元组传递 字典传递
python中函数参数的传递是通过赋值来传递的.函数参数的使用又有俩个方面值得注意:1.函数参数是如何定义的 2.在调用函数的过程中参数是如何被解析 先看第一个问题,在python中函数参数的定义主要 ...
- python 函数参数的传递(参数带星号的说明)
python中函数参数的传递是通过赋值来传递的.函数参数的使用又有俩个方面值得注意:1.函数参数是如何定义的 2.在调用函数的过程中参数是如何被解析 先看第一个问题,在python中函数参数的定义主要 ...
随机推荐
- XCODE的演变及使用经验分享
IOS编程使用的是XCODE 编译器,安装XCODE你需要一台MAC(黑苹果也可以,个人不推荐,不稳定),然后直接去MAC上的APP STORE上下载安装就行,很简单,再次不做过多介绍... OK,那 ...
- 消息队列第一篇:MessageQueue介绍
消息队列有哪些好处或功能: 1.消息可以在断开连接的环境下发送.不需要同时运行正在发送和正在接收的应用程序. 2.使用快捷模式,消息可以非常快地发送.在快捷模式下,消息存储在内存中. 3.对于可恢复的 ...
- form表单转化json对象
利用 $.fn 可以让每一个jquery 对象都能直接使用这个方法. //form表单转化json对象$.fn.serializeObject = function () { var o = {}; ...
- pygame学习笔记(5)——精灵
转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 据说在任天堂FC时代,精灵的作用相当巨大,可是那时候只知道怎么玩超级玛丽.魂斗罗,却对精灵一点也不知.pygame ...
- 命令行执行python文件时提示ImportError: No module named 'xxx'
背景: 最近在写接口自动化测试框架的时候发现,框架使用pycharm ide的时候可以正常跑测试用例,但是在dos窗口输入命令执行测试的时候,import项目内部的包时报错“ModuleNotFoun ...
- 【百度】大型网站的HTTPS实践(三)——HTTPS对性能的影响
HTTPS在保护用户隐私,防止流量劫持方面发挥着非常关键的作用,但与此同时,HTTPS也会降低用户访问速度,增加网站服务器的计算资源消耗.本文主要介绍HTTPS对性能的影响. HTTPS对访问速度的影 ...
- 一个flume agent异常的解决过程记录
今天在使用flume agent的时候,遇到了一个异常, 现把解决的过程记录如下: 问题的背景: 我使用flume agent 来接收从storm topology发送下来的accesslog , ...
- 错误“AxImp.exe”已退出,代码为 -1163019603【转载及个人看法】
http://blog.csdn.net/duguduchong/article/details/17166123 最近使用vs2010 在重新生成解决方案的时候出现 “AxImp.exe”已退出, ...
- VLD 无法打印堆栈调用情况
调试时遇到了一个比较郁闷的问题:同样一个MFC工程,复制之后无任何附加操作,VLD便无法正常打印内存泄漏处的堆栈调用了 百度了一下,重要找到了答案:“VLD不支持中文” 复制工程时windows自动在 ...
- matlab中 assert(any(mask(:)));
首先,matlab中any函数:检测矩阵mask中是否有非零元素,如果有,返回1,:如果没有非零元素,即所有元素都是0,那么则返回0. assert()是一个调试程序时经常使用的宏,在程序运行时它计算 ...