【问题标题】:Python Order Of AssignmentPython 赋值顺序
【发布时间】:2021-10-08 01:38:35
【问题描述】:

Python 赋值顺序的行为与我预期的不同。在javascript中我可以这样写:

x = {};
a = x;

a = a['y'] = {};

console.log(a);
// {}

console.log(x)
// {'y':{}}

因为分配是从右到左进行的,在a = a['y'] = {};中,a['y']被分配{},然后a被分配a['y']——即{}

但是,在 python 中,情况并非如此。相同的设置:

x = {}
a = x

a = a["y"] = {}

print(a)
# {"y": {...}}

print(x)
# {}

在 python 中,这使得a 成为一个自引用对象,并且根本不会在x 上设置“y”。分配不能从左到右,因为在设置“y”之前分配a = a["y"] 会引发错误。那么python在这里做什么以及为什么?

【问题讨论】:

标签: python


【解决方案1】:

Python 的赋值“运算符”= 是专用语句,不是表达式;您的代码不像 JavaScript 中那样由两个赋值表达式组合而成,而是一个允许多个目标的单一语句。当与多个目标一起使用时,Python:

  1. 从左到右存储到目标
  2. 复制对每个目标的相同引用

所以这意味着:

a = a["y"] = {}

相当于:

__unnamed_tmp = {}
a = __unnamed_tmp
a["y"] = __unnamed_tmp

按此顺序,导致您观察到的行为。

【讨论】:

  • 这真的很好 - 比链接的问题更清晰的解释。
猜你喜欢
  • 2011-03-21
  • 2012-02-02
  • 1970-01-01
  • 2012-01-07
  • 2015-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多