返回介绍

避免可变参数的修改

发布于 2024-01-29 22:24:16 字数 1171 浏览 0 评论 0 收藏 0

对可变参数的原处修改的行为不是一个bug——它只是参数传递在Python中工作的方式。在Python中,默认通过引用(也就是指针)进行函数的参数传递,是因为这通常是我们所想要的:这意味着不需要创建多个拷贝就可以在我们的程序中传递很大的对象,并且能够按照需要方便地更新这些对象。实际上,正如我们将在本书第六部分看到的,Python的类模型依赖于原处修改一个传入的"self"参数来更新对象状态。

如果不想要函数内部在原处的修改影响传递给它的对象,那么,我们可以简单地创建一个明确的可变对象的拷贝,正如我们在第6章学到的那样。对于函数参数,我们总是能够在调用时对列表进行拷贝。

如果不想改变传入的对象,无论函数是如何调用的,我们同样可以在函数内部进行拷贝。

这两种拷贝的机制都不会阻止函数改变对象:这样做仅仅是防止了这些改变会影响调用者。为了真正意义上防止这些改变,我们总是能够将可变对象转换为不可变对象来杜绝这种问题。例如,元组,在试图改变时会抛出一个异常。

这种原理会使用到内置tuple函数,将会以一个序列(任意可迭代对象)中的所用元素为基础创建一个新的元组。这种方法从某种意义上来说有些过于极端:因为这种方法强制函数写成绝不改变传入参数的样子,这种办法强制对函数比原本应该的进行了更多的限制,所以通常意义下应该避免出现。或许将来你会发现对于一些调用来说改变参数是有用的一件事。使用这种技术会让函数失去一种参数能够调用任意列表特定方法的能力,包括不会在原处改变对象的那些方法都不再能够使用。

这里最需要记住的就是,函数能够升级为传入可变对象(例如,列表和字典)的形式。这不会是一个问题,并且有时候这对于有些用途很有用处。此外,原处修改传入的可变对象的函数,可能是为此而设计并有意而为之——修改可能是一个定义良好的API的一部分,而我们不应该通过产生副本来违反该API。

但是,你必须要意识到这个属性:如果在你没有预期的情况下对象在外部发生了改变,检查一下是不是一个调用了的函数引起的,并且有必要的话当传入对象时进行拷贝。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文