浅谈python中调用函数对实参原始值的影响

  • Post author:
  • Post category:python


在python中,对象在调用函数时,是否改变原有值得问题中,并无传值或引用的概念,而是要看实参是可变对象还是不可变对象。

1.对于不可变对象(如字符串),调用函数进行运算后,会生成一个新的对象(id()不同),实参原始对象则不会被改变

2.对于可变对象(如列表),调用函数进行运算后,仍对原始对象进行操作(id()相同),因此,实参原始对象会被改变是

3.可变对象包括:列表、字典、set、自定义类,调用函数后会改变实参原始对象的值

4.不可变对象包括:字符串,整型,浮点型,元组、frozenset,range,调用函数后不会实参改变原始对象的值

def f_tring(n):
    n=n+"s"
    print("函数内,对n操作后得id(n)",id(n))
    return n
def f_list(list):
    print("函数内,对n操作后得id(list)",id(list))
    return list.append('end')
if __name__=="__main__":
    print("----------测试不可变对象:string类型数据")
    n="a"
    print('调用函数之前,n=',n)
    print("调用函数之前得id(n)",id(n))
    print('调用函数f_tring(n):',f_tring(n))
    print('调用函数之后,n=',n)
    print("----------测试可变对象:list类型数据")
    list=[1,2,3]
    print('调用函数之前,list=',list)
    print("调用函数之前得id(list)",id(list))
    print('调用函数f_list(list):',f_list(list))
    print('调用函数之后,list=',list)

运行结果:

———-测试不可变对象:string类型数据

调用函数之前,n= a

调用函数之前得id(n) 2308347550832

函数内,对n操作后得id(n) 2308391163056

调用函数f_tring(n): as

调用函数之后,n= a

———-测试可变对象:list类型数据

调用函数之前,list= [1, 2, 3]

调用函数之前得id(list) 2308396673280

函数内,对n操作后得id(list) 2308396673280

调用函数f_list(list): None

调用函数之后,list= [1, 2, 3, ‘end’]



版权声明:本文为m0_74474733原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。