1. 程式人生 > >pyhton鏈式賦值在可變型別/不可變型別上的區別以及其本質

pyhton鏈式賦值在可變型別/不可變型別上的區別以及其本質

關於鏈式賦值的一些注意點:

a=[]
b=[]
x=y=[]
print(a==b) #True
print(x==y) #True
print(a is b) #False
print(x is y) #True
a.append(1)
x.append(666)
print(a,b,x,y)
輸出結果為:
[1] [] [666] [666]

aa=1
bb=1
cc=dd=1
print(aa==bb) #True
print(cc==dd) #True
print(aa is bb) #True
print(cc is dd) #True

總結:對於不可變型別,不存在修改的問題,所以可以多個值指向同一個ID,
如x=y=10,如果想修改成x等於20,只能通過重新賦值的方法,如x=20,此時
x所指向的ID路徑發生變更,並不是在原ID上進行修改,所以不會影響到y的路徑和
y所對應的id
而對於可變型別,由於存在增刪修改的問題,所以如果不是重新賦值,則都是在原id處進行修改,
若存在多個值指向此處id,則這些值的輸出結果都會發生不改變。

 

 

另一個:
s = [1, 2, 3, 4, 5, 6]
i = 0
i = s[i] = 3
print(i)
print(s)
輸出結果:
3
[1, 2, 3, 3, 5, 6]
先說結論:
Python 的鏈式賦值順序是 自左往右 。
原理:
python是一門物件語義型別程式語言。
物件語義,也稱為引用語義,指使用系統標準的拷貝方式將一個源物件拷貝成為目標物件後,
源物件與目標物件之間依然共享底層資源,對任意一方的改變都將影響到另一方。

由於不需要像 C 語言那般要求物件之間的獨立性,
所以,Python 的賦值語句就僅僅是一條語句,而非表示式,也就不存在返回值。
在 Python 的定義中,表示式是由操作符(Operator)連線而成的語句,
但等號 = 並不屬於 Python 的操作符,而是分隔符(Delimiters)。
所以下列語句在 Python 中是非法的。

x = (y = 1) #會報錯

因為 y = 1 並沒有返回值,所以最後執行的是將 “沒有返回值” 賦值給了變數 x,
顯然這樣的語義是不存在意義的。