zoukankan      html  css  js  c++  java
  • python函数值传递还是引用传递

    c/c++中有值传递引用传递的区别。但是python中是值传递还是引用传递呢?首先看python中对变量的定义

    “python中变量是指向某个内存的, 而内存中的内容是不可变的。”

    python的函数调用中,传递的是变量所指向的地址,但仍然很难说它是按照引用还是按照值传递。 比如:

    >>> a=1  # 定义变量 a=1
    >>> def f(v):  # 定义函数,接受参数并改变其值为2
    ...     v=2
    ...     return v
    ... 
    >>> id(a)  # a的地址是10243176
    10243176
    >>> f(a)  # 用f调用a
    2
    >>> id(a)  # a的地址仍然是10243176
    10243176
        >>> a  # a的值仍然也是1
        1
    

    这里虽然传递进 f的是a指向的内存地址, 但由于指向的地址不可变,所以在v=2的时候,其实是新创建了一个变量,并且把其指向2. 因此调用完成后,看起来像是按值传递

    再比如

    >>> l = [1,2,3,]
    >>> f = lambda x:x.append(4)
    >>> id(l)
    140526430340592
    >>> f(l)
    >>> id(l)
    140526430340592
    >>> l
    [1, 2, 3, 4]
    

    这里, 传递的l 在经过f调用后 其值发生了变化,但可以看到它指向的地址仍然没变。 这看起来又像是按引用传递。

    所以,python中很难说是按照引用传递还是按照值传递,因为python中变量指向的对象有时候是可变的,有时候是不可变的。 所以如果对象是可变的,如列表,字典则是按照引用传递,如果对象是不可变的如tuple则是按照值传递

  • 相关阅读:
    BZOJ1862: [Zjoi2006]GameZ游戏排名系统
    BZOJXXXX: [IOI2000]邮局——四边形不等式优化初探
    BZOJ1801: [Ahoi2009]chess 中国象棋
    BZOJ1505: [NOI2004]小H的小屋
    BZOJ1899: [Zjoi2004]Lunch 午餐
    BZOJ1057: [ZJOI2007]棋盘制作
    BZOJ1100: [POI2007]对称轴osi
    BZOJ1123: [POI2008]BLO
    线性规划之单纯形讲解
    BZOJ 3265 志愿者招募加强版(单纯形)
  • 原文地址:https://www.cnblogs.com/kramer/p/6053983.html
Copyright © 2011-2022 走看看