返回介绍

增强赋值语句

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

从Python 2.0起,表11-2所列出的一组额外的赋值语句形式就能够使用了。这些称为增强赋值语句,这是从C语言借鉴而来的,而这些格式大多数只是简写而已。也就是二元表达式和赋值语句的组合。例如,下面的两种格式现在大致相等:

增强赋值语句适用于任何支持隐式二元表达式的类型。例如,下面是两种让变量名增加1的方式。

用于字符串时,增强形式会改为执行合并运算。于是,在这里第二行就相当于输入较长的S=S+"SPAM":

如表11-2所示,每个Python二元表达式的运算符(每个运算符在左右两侧都有值),都有对应的增强赋值形式。例如,X*=Y执行乘法并赋值,X>>=Y执行向右位移并赋值。X//=Y(floor除法)则是在2.2版新增加的赋值形式。

增强赋值语句有三个优点[1]

·程序员输入减少。

·左侧只需计算一次。在X+=Y中,X可以是复杂的对象表达式。在增强形式中,则只需计算一次。然而,在完整形式X=X+Y中,X出现两次,必须执行两次。因此,增强赋值语句通常执行得更快。

·优化技术会自动选择。对于支持原处修改的对象而言,增强形式会自动执行原处的修改运算,而不是相比来说速度更慢的复制。

在这里的最后一点需要多一点的说明。就增强赋值语句而言,在原处的运算可作为一种优化而应用在可变对象上。回想一下,列表可以用各种方式扩展。要增加单个的元素到列表末尾时,我们可以合并或调用append:

此外,要把一组元素增加到末尾,我们可以再次使用合并,或者调用列表的extend方法[2]

在两种情况下,合并对共享对象引用产生的副作用可能会更小,但是,通常会比对等的原处形式运行得更慢。合并操作必须创建一个新的对象,把左侧的复制到列表中,然后再把右侧的复制到列表中。相比而言,原处方法调用直接在一个内存块末尾添加项。

当我们使用增强赋值语句来扩展列表时,可以忘记这些细节。例如,Python会自动调用较快的extend方法,而不是使用较慢的“+”合并运算。

增强赋值以及共享引用

这种行为通常就是我们想要的,但注意,这隐含了“+=”对列表是做原处修改的意思。于是,完全不像“+”合并,总是生成新对象。就所有的共享引用情况而言,只有其他变量名引用的对象被修改,其差别才可能体现出来:

这只对于列表和字典这类可变对象才重要,而且是相当罕见的情况(至少,直到影响程序代码时才算!)。就像往常一样,如果你需要打破共享引用值的结构,就要对可变对象进行拷贝。

[1]C/C++程序员要注意:虽然Python现在支持像X+=Y这类语句,但还没有C的自动递增/递减运算符(例如,X++和--X)。这些无法对应到Python中的对象模型,因为Python没有像对数字那样对不可变对象进行在原处的修改的概念。

[2]就像第6章的建议,我们也可以使用分片赋值语句(例如,L[len(L):]=[11,12,13]),但这种方式和一些简单的extend方法相似。

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

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

发布评论

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