题目来源:邦友问答,因觉得有趣就尝试推论看看 python 多赋值是如何运作的
以下是我推论出来的,不确定是不是正确答案
class Node:def __init__(self):self.parent = Noneif __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) 若需要参数则从暂存区取得