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]
。
此处评论已关闭