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]

 

转载于:https://www.cnblogs.com/ssyfj/p/9022183.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值