• 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]
  • 相关阅读:
    POJ 2236 Wireless Network(并查集)
    POJ 2010 Moo University
    POJ 3614 Sunscreen(贪心,区间单点匹配)
    POJ 2184 Cow Exhibition(背包)
    POJ 1631 Bridging signals(LIS的等价表述)
    POJ 3181 Dollar Dayz(递推,两个long long)
    POJ 3046 Ant Counting(递推,和号优化)
    POJ 3280 Cheapest Palindrome(区间dp)
    POJ 3616 Milking Time(dp)
    POJ 2385 Apple Catching(01背包)
  • 原文地址:https://www.cnblogs.com/ssyfj/p/9022183.html
Copyright © 2020-2023  润新知