【发布时间】:2012-12-12 22:19:12
【问题描述】:
有几次我偶然发现了 Python 中的 C 样式赋值,例如 a = b = 0。通过勤奋的谷歌搜索,我发现这被称为链式赋值:[1]、[2]、[3]。但是,official documentation 中似乎没有提及此功能。
这是否意味着链式分配仍处于实验阶段,或者仅仅是官方文档稍微落后于开发?
【问题讨论】:
标签: python
有几次我偶然发现了 Python 中的 C 样式赋值,例如 a = b = 0。通过勤奋的谷歌搜索,我发现这被称为链式赋值:[1]、[2]、[3]。但是,official documentation 中似乎没有提及此功能。
这是否意味着链式分配仍处于实验阶段,或者仅仅是官方文档稍微落后于开发?
【问题讨论】:
标签: python
看起来官方文档确实提到了它?
assignment_stmt ::= (target_list "=")+ (expression_list | yield_expression)
^ here
【讨论】:
from left to right 很重要!请注意,ys=[None]; zs=[True]; xs=ys; xs=xs[0]=zs 的效果是首先执行xs=zs,然后使xs 成为第一个元素为自身的循环列表。 C 中的并行语法将改为执行xs[0]=zs,然后将xs 重新绑定到zs。要在 Python 中实现 C 行为,您必须改为使用 xs[0] = xs = zs。 C 中 that 的并行语法会失败。如果在 C 和 Python 之间转换,这可能会出错!
你可以使用链式赋值,但它不是 Pythonic 风格。
来自 Python 之禅;; “平面比嵌套好。”
【讨论】: