在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 版权协议,转载请附上原文出处链接和本声明。