0x01 传递非引用对象

对于普通的变量,python函数的值传递过程和大多语言一样都是传递参数的副本,函数体内修改参数值不会对外部传参生效:

def f1(j):
    j = 9999


def main():
    i = 1
    f1(i)
    print i # 输出1


if __name__ == "__main__":
    main()

0x02 传递引用对象

对于引用对象例如map和list,内部的改变可能会生效:

def f2(l):
    l[0], l[1], l[2] = 1, 2, 3
    l.append(4)


def main():
    l = [0, 0, 0]
    f2(l)
    print l  # 输出[1, 2, 3, 4]

注意事项

如果在内部修改了参数的地址,例如对参数本身 进行重新赋值,那么赋值之后的操作不会生效:

def f2(l):
    l[0], l[1], l[2] = 1, 2, 3
    l.append(4)
    print id(l)

    l = [0, 0, 0, 0]
    l.append(9)
    print id(l)


def main():
    l = [0, 0, 0]
    print id(l)
    f2(l)
    print id(l)
    print l

输出结果为:

60252808
60252808  
60292552
60252808
[1, 2, 3, 4]

可以看到,在函数运行前后变量l 的地址并没有变化,但是在f2 内部对l 重新赋值后l 的地址改变了,所以之后的操作对外部的l 并不生效,外部l 依旧是[1, 2, 3, 4]

最后修改:2018 年 03 月 03 日
如果觉得我的文章对你有用,请随意赞赏