賦值語句其實在例子中經(jīng)常使用,其中包括對變量和一些數(shù)據(jù)結構的元素進行賦值;但是賦值方法不止這些,還有如序列解包、鏈式賦值和增量賦值等方法,那么python如何賦值呢?一起來了解下吧:
?
python如何賦值
?
?
python的賦值,尤其是涉及到兩個變量時候二者之間有某種計算關系的時候,可以省去臨時變量。
?
比如C語言中的一段:
?
temp=n
?
n=n+m
?
m=temp
?
就可以在python中簡單寫作:
?
m,n=n,n+m
?
Python如何*最小賦值
?
碼代碼時,有時候需要根據(jù)比較大小分別賦值:
?
import random
?
seq = [random.randint(0, 1000) for _ in range(100)]
?
#方法1:
?
xmax, xmin = max(seq), min(seq)
?
#方法2:
?
xmax, *_, xmin = sorted(seq)
?
從上面這個來看,看不出來方法2的優(yōu)勢來,不過我們常用的是比較兩個數(shù)的大小,并選取:
?
dx, dy = random.sample(seq, 2)
?
#方法1:
?
dx, dy = min(dx, dy), max(dx, dy)
?
#方法2:
?
dx, dy = sorted((dx, dy))
?
Python如何選擇賦值
?
兩個對象做比較有兩種方式,分別是:is與 == ,is比較的是兩個對象是否相同,通過對象的ID值可識別是否為相同對象,==比較的是兩個對象的值是否相等。
?
x1 = [1,2,1]
?
x2 = [1,2,1]
?
print(x1 is x2)
?
print(x1 == x2)
?
print(id(x1))
?
print(id(x2))
?
False
?
True
?
2004573077256
?
2004573077448
?
?
上面我們對x1和x2進行賦值,相對于給兩個變量分別取了名字x1和x2,兩個名字雖然都是列表[1,2,1],但在內存中是兩個獨立的不同的對象,占據(jù)不同的內存空間,就好比兩個名字一樣的人,實則為兩個不同的人。
?
x3 = x2
?
print(x2 is x3)
?
True
?
上面我們將x2對應的對象綁定了一個新的名字叫x3,這就好比一個人,開始給他取了一個x2的大名,后來又給他取了一個x3的小名,本質上還是同一個人,所以,x2和x3所指的其實是同一個對象。
?
通過x2修改對象時,x3也會跟著變化,因為本質上它們是同一個對象,這就好比一個人大名x2,小名x3,x2長了一歲相對于x3也長了一歲。
?
x2.append(2)
?
print(x2)
?
print(x3)
?
[1, 2, 1, 2]
?
[1, 2, 1, 2]
?
但是,當我們給x2重新賦值時,相當于x2不再引用之前的對象,而引用新對象,x3依然引用之前的對象。好比一個人的大名x2和小名x3,給x2重新賦值就相當于給另外一個人取大名x2,但是x3還是開始那個人的小名。
?
x2 = [3,4,3]
?
print(x2)
?
print(x3)
?
[3, 4, 3]
?
[1, 2, 1, 2]
?
python的賦值和賦址
?
python的數(shù)字和字符串的值是不變的(元祖也是不可變的),所以當一個變量(數(shù)字或字符串)進行值改變的操作時,其實是新開辟了一個地址來存放這個新值。?
?
例如:
?
>>>a=2
?
>>>b=a
?
>>>a=3
?
>>>b
?
當執(zhí)行a=3時,其實是新開辟了一塊內存空間來存放3,并且把索引a從2那邊解除,指向了存放3的內存地址。所以?
?
a的值是3,但是b還是2。因為b依舊指向2所在的內存空間。
?
再來看看其他非數(shù)字和字符串的操作,例如列表,
?
>>>a=[2]
?
>>>b=a
?
>>>a.append(3)
?
>>>b
?
[2,3]
?
當執(zhí)行a.append時,因為列表的值是可以變化的,所以就在原來的存放a的內存地址改變了a的值,由于a,b?
?
是指向同一地址空間的索引,所以當此內存地址所存儲的值被改變時,打印b時,b的值也變化了。
?