Python 赋值顺序

mic*_*cah 1 python

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

x = {};
a = x;

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

console.log(a);
// {}

console.log(x)
// {'y':{}}
Run Code Online (Sandbox Code Playgroud)

因为赋值是从右到左发生的,所以 in a = a['y'] = {};a['y']被赋值{},然后a被赋值a['y']- 这是{};

然而,在Python中,情况并非如此。相同的设置:

x = {}
a = x

a = a["y"] = {}

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

print(x)
# {}
Run Code Online (Sandbox Code Playgroud)

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

Sha*_*ger 5

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

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

所以这意味着:

a = a["y"] = {}
Run Code Online (Sandbox Code Playgroud)

相当于:

__unnamed_tmp = {}
a = __unnamed_tmp
a["y"] = __unnamed_tmp
Run Code Online (Sandbox Code Playgroud)

按照这个顺序,导致您观察到的行为。