要理解上述问题,需要明白,在Python中一切皆对象。所以函数的参数在传递过程中,传递的都是对象的引用,而引用是指向内存中的地址的(id()查看的是当前变量的地址值)。
所以上述问题本身都不是特别的严谨,那么为什么还有上述的问题呢?我猜想面试想问的是:python中,函数参数为基本数据类型时,传递的是值传递还是引用传递?
这个是因为在实际使用时,不同的数据类型表现出来的现象是不一样的,但是本质上都是传递的是对象的引用。在实际使用时,因为不可变数据类型是不能改变其内存中的值的,所以表现出来的现象,好像是给不可变数据类型复制了一份再进行传递的,但事实上只是两个不同的变量指向了同一块内存中的地址而已。可变数据类型,因为其在内存中的值是可以改变的,所以在函数内改变可变数据类型的值,是会影响到函数外的变量,因为这两个参数是指向的同一块内存地址的。
题外话:python中,整型(int)值为0-256时是共享内存的(python3.6 windows7 | python3.5 ubuntu18.4 在上面环境上测试,256之后就不再共享地址了,其他机型不知道是不是这样 ),这样做有什么用呢?我的理解是:对于常用整型数据,可以节省内存开销。
l = [1, 2, 3]
t = (1, 2, 3)
b = 2
print('id(l):{}'.format(id(l)))
print('id(l[1]):{}'.format(id(l[1])))
print('id(t[1]):{}'.format(id(t[1])))
print('id(b):{}'.format(id(b)))
print('--------------')
def aaa():
l = [1, 2, 3]
t = (1, 2, 3)
b = 2
print('id(l):{}'.format(id(l)))
print('id(l[1]):{}'.format(id(l[1])))
print('id(t[1]):{}'.format(id(t[1])))
print('id(b):{}'.format(id(b)))
aaa()
第一次写博客,如果有写错的地方,请指教!