---
# System prepended metadata

title: Python 多賦值問題，推論與結果
tags: [Python]

---

---
tags: Python
---

# Python 多賦值問題，推論與結果

[![hackmd-github-sync-badge](https://hackmd.io/vb7M8YydQDWYk4Y9G_YBxg/badge)](https://hackmd.io/vb7M8YydQDWYk4Y9G_YBxg)



以下是我推論出來的，不確定是不是正確答案
```python
class Node:
	def __init__(self):
		self.parent = None

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


## 題目一:
先來看他是如何賦值的，先給他們標上記號好分辨
```python
   (1), (2) =  (3),   (4)
a.parent, a = None, a.parent

輸出結果:
a = 20
```
### 1. <font color='red'>(x) 想法一:</font>

賦予數值的順序: (1)把 4 給 2 ，(2)把 3 給 1  
(1) a = a.parent ，使得 a 等於 20  
(2) a.parent = None，若此推論正確則這裡應該會有 error  
但是由於 a 已經等於 20，不會有參數 parent  
程序能正確運行，所以此推論錯誤

### 2. <font color='red'>(x) 想法二:</font>

順序: (1)把 3 給 1 ，(2)把 4 給 2  
a.parent = None 使得 a.parent 值為 None  
然後 a = a.parent，若依照此想法則 a 的答案應該會是 None  
但是正確答案是20，此推論錯誤

### 3. <font color='red'>(x) 想法三:</font>

因為依照基本的 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. <font color='green'>(o) 想法四:</font>

一樣有個暫存區，把 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，此推論正確

## 題目二
```python
(1),  (2)   =    (3),   (4)
a, a.parent = a.parent, None

輸出結果:
AttributeError: 'int' object has no attribute 'parent'
```
### <font color='green'>(o) 想法一:</font>
依照上面第四部成功的結果來推算
把 a.parent, None 存入暫存區
順序: (1)把 3 給 1 ，(2)把 4 給 2
(1) a = a.parent 使得 a 的值為 20
(2) a.parent = None，因為 a 是 int 所以沒有 parent 參數
推論正確

## 題目三
已經知道兩個參數的運作方式，那三個參數是如何運作?  
在已知題目一能正常運算出結果，左右再加上一個參數試試
```python
  (1),   (2),   (3)   =  (4),    (5),  (6)
a.parent, a, a.parent = None, a.parent, 10
```
### <font color='green'>(o) 想法一</font>
這次就先不看結果，看看之前推論是否正確  
先把 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  
來看結果
```python
輸出結果:
AttributeError: 'int' object has no attribute 'parent'
```
得出答案，此推論正確
* 要注意的地方是這裡的第二步(2)是從暫存區讀取資料，若是從第一步(1)的結果 a.parent = None 來把 a.parent 的值給 a 此時 a 的值為 None 應該輸出的是```AttributeError: 'NoneType' object has no attribute 'parent'```

## 結果
:::info
(1)開始運算前要先把等式右邊的變數都加入到暫存區  
(2)從等式右邊由左往右一個一個運算  
(3)若需要參數則從暫存區取得  
:::