python中函数值的传递方式
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] 。
评论已关闭