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

一行中有多个Python赋值语句

蒙奇
2023-03-14
问题内容

(不用担心,这不是关于拆开元组的另一个问题。)

在python中,类似这样的语句foo = bar = baz = 5将变量foo,bar和baz分配给5。它可以从左到右分配这些变量,这可以通过诸如nastier的例子来证明

>>> foo[0] = foo = [0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'foo' is not defined
>>> foo = foo[0] = [0]
>>> foo
[[...]]
>>> foo[0]
[[...]]
>>> foo is foo[0]
True

但是python语言参考指出赋值语句具有以下形式

(target_list "=")+ (expression_list | yield_expression)

并在分配时expression_list首先评估,然后进行分配。

那么foo = bar = 5,如果bar = 5不是,该行如何有效expression_list?如何解析和评估一行上的这些多个分配?我阅读的语言参考书是否错误?


问题答案:

所有功劳归@MarkDickinson,后者在评论中回答了此问题:

请注意+in中(target_list "=")+,它表示一个或多个副本。在中foo = bar = 5,有两个(target_list "=")作品,而expression_list部分只是5

赋值语句中的所有target_list产生式(即看起来像的东西foo =)在被评估expression_list后,expression_list会从左到右分配到语句的右端。

当然,通常的“ tuple-unpacking”赋值语法也可以在这种语法下工作,让您可以执行以下操作

>>> foo, boo, moo = boo[0], moo[0], foo[0] = moo[0], foo[0], boo[0] = [0], [0], [0]
>>> foo
[[[[...]]]]
>>> foo[0] is boo
True
>>> foo[0][0] is moo
True
>>> foo[0][0][0] is foo
True


 类似资料:
  • 问题内容: 我有这样的桌子 我需要如下结果 请帮我 问题答案: SQLFiddle演示 使用 SQLFiddle演示

  • 问题内容: 是否可以通过if条件执行多个分配,如以下代码? 问题答案: 否。根据规范,在if语句的开头仅允许一个“简单语句” 。 该建议的方法是这可能会返回一个错误,所以我想你想是多重考验:

  • 问题内容: 考虑以下Python 3代码: 现在考虑同时在a和i上进行分配的以下两个版本: 作业版本1: 作业版本2: 我希望同时分配的这两个版本在语义上是等效的。但是,如果您在每次同时分配之后检查a和i的值,则会得到不同的状态: 分配后版本1的输出: 分配后版本2的输出: 我不是Python语义学方面的专家,但是这种行为似乎很奇怪。我希望两个分配的行为都与分配版本1相同。此外,如果您检查以下链接

  • 编程最简单的算法之一,莫过于变量交换。交换变量的常见算法需要一个中间变量进行变量的临时保存。用传统方法编写变量交换代码如下: 在计算机刚发明时,内存非常“精贵”。这种变量交换往往是非常奢侈的。于是计算机“大牛”发明了一些算法来避免使用中间变量: 这样的算法很多,但是都有一定的数值范围和类型要求。 到了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 都是局部变量

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