当前位置: 首页 > 面试题库 >

Python中的同时赋值语义

戚承业
2023-03-14
问题内容

考虑以下Python 3代码:

a = [-1,-1,-1]
i = 0

现在考虑同时在a和i上进行分配的以下两个版本:

作业版本1:

a[i],i = i,i+1

作业版本2:

i,a[i] = i+1,i

我希望同时分配的这两个版本在语义上是等效的。但是,如果您在每次同时分配之后检查a和i的值,则会得到不同的状态:

print(a,i)分配后版本1的输出:

[0, -1, -1] 1

print(a,i)分配后版本2的输出:

[-1, 0, -1] 1

我不是Python语义学方面的专家,但是这种行为似乎很奇怪。我希望两个分配的行为都与分配版本1相同。此外,如果您检查以下链接,可能会期望两个分配版本都导致相同的状态:

链接到Google图书中的书摘

关于同时分配的Python语义,我缺少什么吗?

注意 :例如,当变量a具有整数类型时,这种奇怪的行为似乎是不可再现的。它似乎要求a是列表类型(也许任何可变类型都是这种情况吗?)。


问题答案:

在这种情况下:

i, a[i] = i + 1, i

右侧求值为一个元组(1,0)。然后将该元组解包到i然后a[i]a[i] 拆包 期间
而不是之前进行评估的,因此对应于a[1]

由于在进行任何拆箱之前都会先评估a[i]右侧,因此a[0]无论最终值是多少,在右侧引用始终是i

这是另一个无用的有趣例子供您锻炼

>>> a = [0,0,0,0]
>>> i, a[i], i, a[i] = range(4)
>>> a
[1, 0, 3, 0]


 类似资料:
  • 很多从 Java、C 语言转向 Python 的程序员对 Python 中的赋值语句感到很神奇或者很困惑, Python 中赋值的特殊之处有 3 点特殊之处:出 0-127 的数字、部分字符串外都是引用赋值; 和其它支持函数式编程范式的语言一样,支持模式匹配;Python 支持连续赋值。 模式匹配 支持函数式编程范式的语言通常也支持模式匹配,例如在 Erlang 中我可以这样赋值: [Head |

  • 编程最简单的算法之一,莫过于变量交换。交换变量的常见算法需要一个中间变量进行变量的临时保存。用传统方法编写变量交换代码如下: 在计算机刚发明时,内存非常“精贵”。这种变量交换往往是非常奢侈的。于是计算机“大牛”发明了一些算法来避免使用中间变量: 这样的算法很多,但是都有一定的数值范围和类型要求。 到了Go语言时,内存不再是紧缺资源,而且写法可以更简单。使用 Go 的“多重赋值”特性,可以轻松完成变

  • 赋值语句在 Lua 被强化了,它可以同时给多个变量赋值。 例如: a,b,c,d=1,2,3,4 甚至是: a,b=b,a --多么方便的交换变量功能啊 在默认情况下,变量总是认为是全局的。假如你要定义局部变量,则在第一次赋值的时候,需要用 local 说明。比如: local a,b,c = 1,2,3 -- a,b,c 都是局部变量

  • 问题内容: (不用担心,这不是关于拆开元组的另一个问题。) 在python中,类似这样的语句将变量foo,bar和baz分配给5。它可以从左到右分配这些变量,这可以通过诸如nastier的例子来证明 但是python语言参考指出赋值语句具有以下形式 并在分配时首先评估,然后进行分配。 那么,如果不是,该行如何有效?如何解析和评估一行上的这些多个分配?我阅读的语言参考书是否错误? 问题答案: 所有功

  • 本文向大家介绍python实现同时给多个变量赋值的方法,包括了python实现同时给多个变量赋值的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了python实现同时给多个变量赋值的方法。分享给大家供大家参考。具体分析如下: python中可以同时给多个变量赋值,下面列举了三种方法 希望本文所述对大家的Python程序设计有所帮助。

  • 问题内容: 分配给变量like 和使用let like有什么区别?还是像和这样的案例?每种方法的优点和缺点是什么? 问题答案: 完全是做什么的,它用于算术表达式。目前几乎没有差别之间和。 您的示例无效。要将单词添加到变量(这是一个字符串操作),将不起作用,因为它不是算术表达式: 实际上,如果仅设置了变量,则它是一个算术表达式,否则将被视为零。