【python小课堂专栏】python面试最常见的一个知识点

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/s740556472/article/details/85755446

python面试最常见的一个知识点

前言

今天呢分享一个在python中面试最常见到的一个知识点,非常基础,对于刚学习的人来说也会经常弄错 ---- python语言特性的函数参数传递,实际上在早期的小课堂中,有分享过,这里用例子说明下,相信实践出真理。

示例

例子1:

a = 1

""" 例子1:问 a 的值最终是多少? """
def fun_a(a):
    a = 2

fun_a(a)

例子2:


b = []

""" 例子2:b是一个列表,问,b的值是多少?"""
def fun_b(b):
    b.append(1)

fun_b(b)

根据id对比以及打印得出结论

对于上面的两个小例子,我们可以通过下面的方式来亲手验证下:

例1:

a = 1

""" 例子1:函数a,a为int """
def fun_a(a):
    print(f'函数中形参a的id:{id(a)}')
    a = 2
    print(f'a=2之后a的id:{id(a)}')
    print(f'数字2的id:{id(2)}')


fun_a(a)
print(f'函数外面a的id:{id(a)}')
print(f'a的值:{a}')

结果输出:

>>> 函数中形参a的id1467051488
>>> a=2之后a的id1467051520
>>> 数字2id1467051520
>>> 函数外面a的id1467051488
>>> a的值:1

例2:

b = []

""" 例子2:函数b,b为list """
def fun_b(b):
    print(f'函数中形参b的id:{id(b)}')
    b.append(1)
    print(f'b.append之后b的id:{id(b)}')

fun_b(b)
print(f'函数外面b的id:{id(b)}')
print(f'b的值:{b}')

输出结果:

>>> 函数中形参b的id1989582375944
>>> b.append之后b的id1989582375944
>>> 函数外面b的id1989582375944
>>> b的值:[1]

原理及总结

str为不可变对象,list为可变对象。在python中,str、 tuples、和numbers是不可更改的对象,而 list, dict, set 等则是可以修改的对象。(这就是这个问题的重点)

这么说可能还是不太明白,用白话解释一下:

例子1:

当一个引用a传递给函数fun_a的时候,函数会自动复制一份引用a(可以参考打印输出的id内存地址),这个函数里的引用a和外边的引用a没有半毛关系,内存地址就不一样!也就是说函数fun_a把引用指向了一个不可变对象nums、str,所以不会影响到函数外面的同名变量。

例子2:

函数内的引用指向的是可变对象list,对它的操作就和定位了指针地址一样,在内存里进行修改。可以看到对list进行append操作内存地址无论是在函数内还是函数外都是不变的!

至此完!


有想学习python的同学,欢迎交流,公众号:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/s740556472/article/details/85755446