请问Python函数的形参,为什么有时“浅拷贝”有时“深拷贝”?

请问Python函数的形参,为什么有时可以改变、有时不可以?原谅我不知道该怎么形容,所以借用了“深浅拷贝”这样的概念…

def func(x,y,l):
    x = y+1
    l.append(0)
    
if "__main__" == __name__:
    x=10; y=10; l=[3,2,1]
    func (x,y,l)
    print (x,y, l)

请问:运行函数func之后,为什么x和y的值没有变化、而l变了?
1 有没有办法让l也像x和y那样不变、运行函数之后直接释放?
2 有没有办法让x和y也像l那样改变?return吗?

谢谢了先!

阅读 2.3k
1 个回答

首先需要理解两点,1赋值(=)是对地址的应用;2int为可变不对象,list为可变对象。这里简单说说可变和不可变,不可变对象的值改变了,引用的地址就改变了可变对象的值改变,但是引用的地址不变,x和y的重新赋值会导致x,y指向其他地址,但是l一直指向同一个地址。想要看关于可变和不可变的详细介绍,链接https://zhuanlan.zhihu.com/p/...

问:“为什么x和y的值没有变化、而l变了?”
x=10,y=10,只是对“10”的同一个引用,x和y函数中的x重新赋值,指向地址id(x)已经改变,而l指向地址不变,

问:“有没有办法让l也像x和y那样不变、运行函数之后直接释放?”
不能,只能把这个元素从list中删除掉

问:”有没有办法让x和y也像l那样改变?return吗?“
需要给x,y重新赋值,下面代码只是对x

def func(x, y, l):
    x = y + 1
    l.append(0)
    return x, l
if "__main__" == __name__:
    x = 10;
    y = 10;
    l = [3, 2, 1]
    x, l = func(x, y, l)
    print (x, y, l)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题