Python与JavaScript链式赋值行为差异及底层执行逻辑咨询
Python与JavaScript链式赋值的差异及执行逻辑
两者的核心差异在于链式赋值的赋值方向不同,且两类语言执行赋值前都会优先计算最右侧的表达式结果,具体执行逻辑拆解如下:
Python链式赋值执行规则
Python的链式赋值逻辑为:先计算最右侧表达式得到固定值,再从左到右依次赋值到每个目标。
对语句a = a["y"] = {}的执行步骤拆解:
- 优先计算最右侧的
{},生成一个新的空字典对象,记为temp_obj,此时temp_obj的内存地址固定。 - 从左到右执行第一个赋值:将变量
a指向temp_obj。注意:此时a已经不再指向初始的x字典,和x完全脱离关联。 - 执行第二个赋值:给当前
a(也就是temp_obj)的y键赋值为temp_obj,相当于执行temp_obj["y"] = temp_obj,形成自引用。
所以最终运行结果符合你观察到的情况:
a就是temp_obj,结构为{"y": <自己的引用>}x全程没有被修改,保持初始的空字典。
对应代码执行效果:
x = {} a = x a = a["y"] = {} print(a) # {"y": {...}} print(x) # {}
JavaScript链式赋值执行规则
JavaScript的链式赋值逻辑为:先计算最右侧表达式得到固定值,再从右到左依次赋值到每个目标。
对语句a = a['y'] = {}的执行步骤拆解:
- 优先计算最右侧的
{},生成新的空对象temp_obj。 - 从右到左执行第一个赋值:给
a['y']赋值为temp_obj,此时a仍然指向初始的x对象,相当于给x新增了y属性,值为temp_obj。 - 执行第二个赋值:将变量
a指向temp_obj。
所以最终运行结果为:
a就是空的temp_objx被修改为{'y': temp_obj}
对应代码执行效果:
x = {}; a = x; a = a['y'] = {}; console.log(a); // {} console.log(x) // {'y':{}}
内容的提问来源于stack exchange,提问作者micah
相关产品推荐
相关产品推荐

