Python 多赋值问题,推论过程与结果

题目来源:邦友问答,因觉得有趣就尝试推论看看 python 多赋值是如何运作的

以下是我推论出来的,不确定是不是正确答案

class Node:
	def __init__(self):
		self.parent = None

if __name__ == __main__:
	a = Node()
	a.parent = 20

题目一:

先来看他是如何赋值的,先给他们标上记号好分辨

   (1), (2) =  (3),   (4)
a.parent, a = None, a.parent

输出结果:
a = 20

1. (x) 想法一:

赋予数值的顺序: (1)把 4 给 2 ,(2)把 3 给 1
(1) a = a.parent ,使得 a 等於 20
(2) a.parent = None,若此推论正确则这里应该会有 error
但是由於 a 已经等於 20,不会有参数 parent
程序能正确运行,所以此推论错误

2. (x) 想法二:

顺序: (1)把 3 给 1 ,(2)把 4 给 2
a.parent = None 使得 a.parent 值为 None
然後 a = a.parent,若依照此想法则 a 的答案应该会是 None
但是正确答案是20,此推论错误

3. (x) 想法三:

因为依照基本的 a, b = b, a 能够正确交换顺序
所以应该有暂时储存资料的部分
先把右边的 None, a.parent 放入暂存的资料区
然後顺序: (1)把 4 给 2 ,(2)把 3 给 1
(1)a = a.parent 使得 a = 20
(2) a.parent = None ,因 a 无 parent
正确答案是20,此推论错误,也没使用到暂存资料区

4. (o) 想法四:

一样有个暂存区,把 None, a.parent 存入暂存区
顺序: (1)把 3 给 1 ,(2)把 4 给 2
(1) a.parent = None,此时 a.parent 参数为 None
(2) 使得 a = a.parent
无暂存的时候这里是应该是要错误的,但正确结果是 20
有暂存时候可以看到我们的暂存区 a.parent 的参数正好是 20
所以将暂存区的 a.parent 赋予值给 a,此推论正确

题目二

(1),  (2)   =    (3),   (4)
a, a.parent = a.parent, None

输出结果:
AttributeError: 'int' object has no attribute 'parent'

(o) 想法一:

依照上面第四部成功的结果来推算
把 a.parent, None 存入暂存区
顺序: (1)把 3 给 1 ,(2)把 4 给 2
(1) a = a.parent 使得 a 的值为 20
(2) a.parent = None,因为 a 是 int 所以没有 parent 参数
推论正确

题目三

已经知道两个参数的运作方式,那三个参数是如何运作?
在已知题目一能正常运算出结果,左右再加上一个参数试试

  (1),   (2),   (3)   =  (4),    (5),  (6)
a.parent, a, a.parent = None, a.parent, 10

(o) 想法一

这次就先不看结果,看看之前推论是否正确
先把 None, a.parent, 10 放入暂存区
顺序: (1)把 4 给 1 ,(2)把 5 给 2 ,(3)把 6 给 3
(1)a.parent = None,使得 a.parent 为 None
(2)a = a.parent,此时要从暂存区读取资料:a.parent = 20
所以这里的 a 为 20
(3)a.parent = 10,需要把 10 的值给 a.parent
但因为 a 目前为 20 所以他没有参数 parent
来看结果

输出结果:
AttributeError: 'int' object has no attribute 'parent'

得出答案,此推论正确

  • 要注意的地方是这里的第二步(2)是从暂存区读取资料,若是从第一步(1)的结果 a.parent = None 来把 a.parent 的值给 a 此时 a 的值为 None 应该输出的是AttributeError: 'NoneType' object has no attribute 'parent'

结果

(1) 开始运算前要先把等式右边的变数都加入到暂存区
(2) 从等式右边由左往右一个一个运算
(3) 若需要参数则从暂存区取得


<<:  CMoney软件工程师战斗营_Week 13

>>:  k8s elk 架设elastalert - 对slack发出及时的警报系统

Day14:【TypeScript 学起来】Interfaces(介面) 笔记整理

终於来到 interface,觉得这个算是颇重要的一趴,让我们看下去。这大概是我最认真做笔记的一篇...

模型架构--3

ArcFace 在2018年发表,在SphereFace的基础上改进对特徵向量归一化和角度间隔,强化...

[DAY15]跟 Vue.js 认识的30天 - Vue 动态模组(Dynamic Components)

这次写的内容是之前都没使用过的,所以就尽量让自己有概念,希望之後能使用到。 使用 v-bind:is...

EC的农地辣麽大,作物辣麽多,来认真找作物了(1)ES的逐一说文解字-搜寻

来到第28天了,却觉得头很痛 ES的收寻知识点有点大,要细讲自己也讲不清楚 要粗讲,可能又讲的不清楚...

股市/程序交易

股市/程序交易 https://wolkesau.medium.com/股市-程序交易-ba9898...