zoukankan      html  css  js  c++  java
  • 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]
  • 相关阅读:
    学习笔记4
    学习笔记2
    学习笔记1
    树莓派与Arduino串口通信
    团队大作业第三周周报
    团队大作业第二周周报
    团队大作业第一周周报
    RTCSD_第三次作业
    RTCSD_第二次作业
    RTCSD_第一次作业
  • 原文地址:https://www.cnblogs.com/ssyfj/p/9022183.html
Copyright © 2011-2022 走看看