python中修改形参对实参的影响,如何避免形参对实参的影响
程序员文章站
2022-07-08 15:50:27
自定义一个测试函数,通过对比形参和实参的ID来研究修改形参对实参的影响。def test(a) :print("a =",a,id(a))c = 20test(c)print("c =",c,id(c))a = 20 140707504189792c = 20 140707504189792传参后a和c的id相同,说明a和c指向同一对象。接下来对a进行重新赋值。def test(a) :a = 10print("a =",a,id(a))c = 20test(c)...
自定义一个测试函数,通过对比形参和实参的ID来研究修改形参对实参的影响。
def test(a) :
print("a =",a,id(a))
c = 20
test(c)
print("c =",c,id(c))
a = 20 140707504189792
c = 20 140707504189792
传参后a和c的id相同,说明a和c指向同一对象。
接下来对a进行重新赋值。
def test(a) :
a = 10
print("a =",a,id(a))
c = 20
test(c)
print("c =",c,id(c))
a = 10 140707504189472
c = 20 140707504189792
a的值和id已经发生了改变,但是c没有发生变化,说明对a重新赋值过程中,系统新建了一个对象,a指向了新的对象,且对c没有产生影响。
接下来测试传列表的情况。
def test(a) :
print("a =",a,id(a))
c = [1,2,3]
test(c)
print("c =",c,id(c))
a = [1, 2, 3] 3051365556744
c = [1, 2, 3] 3051365556744
a和c同样指向同一个对象,接下来通过形参a修改列表中的元素。
def test(a) :
a[0] = 6
print("a =",a,id(a))
c = [1,2,3]
test(c)
print("c =",c,id(c))
a = [6, 2, 3] 2355399385608
c = [6, 2, 3] 2355399385608
a和c的id同时发生改变且指向同一对象,原因是修改列表中的元素是对对象进行操作,系统会新建一个对象,然后将新的ID赋给指向原对象的所有变量。所以,对对象进行操作会影响所有指向该对象的变量。可以使用以下两种方法使形参与实参相互独立:
def test(a) :
a[0] = 6
print("a =",a,id(a))
c = [1,2,3]
#方法一:传副本过去
test(c.copy())
#方法二:
test(c[:])
print("c =",c,id(c))
a = [6, 2, 3] 2606175445576
a = [6, 2, 3] 2606175445576
c = [1, 2, 3] 2606175445512
本文地址:https://blog.csdn.net/weixin_45567090/article/details/110940889