0x01 传递非引用对象
对于普通的变量,python函数的值传递过程和大多语言一样都是传递参数的副本,函数体内修改参数值不会对外部传参生效:
1 2 3 4 5 6 7 8 9 10 11 12 |
def f1(j): j = 9999 def main(): i = 1 f1(i) print i # 输出1 if __name__ == "__main__": main() |
0x02 传递引用对象
对于引用对象例如map和list,内部的改变可能会生效:
1 2 3 4 5 6 7 8 9 |
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] |
注意事项
如果在内部修改了参数的地址,例如对参数本身
进行重新赋值,那么赋值之后的操作不会生效:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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 |
输出结果为:
1 2 3 4 5 |
60252808 60252808 60292552 60252808 [1, 2, 3, 4] |
可以看到,在函数运行前后变量l
的地址并没有变化,但是在f2
内部对l
重新赋值后l
的地址改变了,所以之后的操作对外部的l
并不生效,外部l
依旧是[1, 2, 3, 4]
。
评论