一、复习巩固

首先我们复习一下什么叫做值传递,什么叫做地址传递

1.值传递

在实参向形参传递的过程中,传递的只是实参的值,而在函数体操作的时候,实际操作的并不是实参而是形参,所以,值传递不改变原变量值

2.地址传递

在实参向形参传递的过程中,传递的是实参的地址,实参和形参共同指向同一块地址,所以,在函数内部修改形参的同时也修改了实参,即,地址传递会改变原变量

二、代码实例讲解:
#值传递

a = 2
def valueTransmit(x):
    print('x没有修改之前的值:{}'.format(x))
    print('x没有修改之前的地址:{}\n'.format(id(x)))

    x = 3
    print('x修改之后的值:{}'.format(x))
    print('x修改之后的地址:{}\n'.format(id(x)))
    pass
pass

print('a没有传递之前的值:{}'.format(a))
print('a没有传递之前的地址:{}\n'.format(id(a)))
valueTransmit(a)
print('a传递之后的值:{}'.format(a))
print('a传递之后的地址:{}'.format(id(a)))

#运行结果:
a没有传递之前的值:2
a没有传递之前的地址:23031952

x没有修改之前的值:2
x没有修改之前的地址:23031952

x修改之后的值:3
x修改之后的地址:23031968

a传递之后的值:2
a传递之后的地址:23031952

这里证明a的传递是值传递,函数内部对a的改变对他没有丝毫影响

#地址传递
listA = []
def addressTransmit(x):
    print('x没有修改之前的地址:{}'.format(id(x)))
    print('x没有修改之前的值:{}\n'.format(x))
    x.append([1,2,3,4])
    print('x修改之后的地址:{}'.format(id(x)))
    print('x修改之后的值:{}\n'.format(x))
    pass
pass

print('listA传递之前的地址:{}'.format(id(listA)))
print('listA传递之前的值:{}\n'.format(listA))
addressTransmit(listA)

print('listA传递之后的地址:{}'.format(id(listA)))
print('listA传递之后的值:{}'.format(listA))

#运行结果:
listA传递之前的地址:33668040
listA传递之前的值:[]

x没有修改之前的地址:33668040
x没有修改之前的值:[]

x修改之后的地址:33668040
x修改之后的值:[[1, 2, 3, 4]]

listA传递之后的地址:33668040
listA传递之后的值:[[1, 2, 3, 4]]

这里证明listA的传递是地址,函数直接对原来的变量进行操作,所以listA最终的值改变了。

三、归纳总结

1.函数传参过程中,对于一些基本数据类型,如int(整型),float(浮点型),str(字符串)等,是值传递,函数内部对以上数据类型的数据进行修改时并不会改变原值。

2.对于list(列表)、dict(字典)、tuple(元组)则是地址传递,函数内部对以上数据类型操作时会改变原数据值。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐