變量是什么
在 python 中究竟該如何正確理解變量的賦值過程呢廊敌?
s = 'hello'
以上的變量賦值铜跑,應(yīng)該說成把變量分配給對象更合理。
hello
這個(gè)字符串對象會(huì)在內(nèi)存中先被創(chuàng)建骡澈,之后再把變量 s
分配給這個(gè)對象锅纺。
所以要理解 Python 中的變量賦值,應(yīng)該始終先看等號右邊
秧廉。
對象在右邊先被創(chuàng)建或者被獲取
伞广,在此之后左邊的變量才會(huì)綁定到對象上,這就像為對象貼上了標(biāo)簽疼电。
變量是對象的標(biāo)簽或者說是對象的別名嚼锄,當(dāng)然一個(gè)對象可以有多個(gè)標(biāo)簽或者別名
如下:
a = 1
b = a
a = 2
print(b) # b 會(huì)是 ?
a = 1
時(shí)如下圖:
b = a
時(shí)如下圖:
a = 2
時(shí)如下圖:
上面的 b = a
我們稱它為 傳遞引用,此時(shí)對象會(huì)擁有兩個(gè)名稱(標(biāo)簽) 蔽豺,分別是 a
和 b
變量的多元賦值
在 Python3 中你可以這樣給變量賦值
In [2]: x, y, z = 1, 2, 3
In [3]: x
Out[3]: 1
In [4]: y
Out[4]: 2
In [5]: z
Out[5]: 3
當(dāng)然也可以這樣
In [10]: a, b, c = 'abc'
In [11]: a
Out[11]: 'a'
In [12]: b
Out[12]: 'b'
In [13]: c
Out[13]: 'c'
這種賦值方式可以稱為元組解包区丑,你若是喜歡,叫它多元賦值也行。
元組解包其實(shí)適用于所有的序列類型(可迭代對象)的數(shù)據(jù): 字符串沧侥、列表可霎、元組等
假如你需要對一個(gè)序列類型中的數(shù)據(jù)進(jìn)行一一解開賦值,那就需要等號左邊的變量名和序列類型數(shù)據(jù)中的元素個(gè)數(shù)相同宴杀。
當(dāng)然也可以只要其中的一個(gè)癣朗,或者一部分,像下面的幾種情況:
1. 只要要其中的一部分
有時(shí)候旺罢,你可能只想解壓一部分旷余,丟棄其他的值。對于這種情況 Python 并沒有提供特殊的語法扁达。 但是你可以使用任意變量名去占位正卧,到時(shí)候丟掉這些變量就行了。
In [22]: data = [ 'ACME', 50, 91.1, (2012, 12, 21) ]
In [23]: _, shares, price, _ = data
In [24]: shares
Out[24]: 50
In [25]: price
Out[25]: 91.1
在這里必須保證你選用的那些占位變量名在其他地方?jīng)]被使用到跪解。
這里采用了英文的短下劃線_
作為臨時(shí)變量名炉旷。
這樣懂行的人看到這個(gè),就會(huì)知道在之后的代碼中將不會(huì)再次用到此變量叉讥。
2. 只要第一個(gè)
In [14]: s, *_ = ['shark', 18, 100]
In [15]: s
Out[15]: 'shark'
*
是 python3 中的一個(gè)表達(dá)式窘行,他可以把沒有明確指出元素搜集起來。
可以稱它為星號解壓語法
3. 只要最后一個(gè)
In [16]: *_, score = ['shark', 18, 100]
In [17]: score
Out[17]: 100
4. 要第一個(gè)节吮,其他的都放到列表中
In [19]: name, *info = ['shark', 18, 100]
In [20]: name
Out[20]: 'shark'
In [21]: info
Out[21]: [18, 100]
值得注意的是上面解壓出的
info
變量永遠(yuǎn)都是列表類型抽高,不管解壓的數(shù)字的數(shù)量是多少(包括 0 個(gè))
你可以試著把等號左邊的兩個(gè)調(diào)換一下位置^_^
5. 嵌套的也好使
In [28]: record = ('xiguatian', 50, 123.45, (12, 18, 2012))
In [29]: name, *_, (*_, year) = record
In [30]: name
Out[30]: 'xiguatian'
In [31]: year
Out[31]: 2012
6. 用于 字符串的分割
In [35]: line = 'nobody:x:99:99:Nobody:/:/sbin/nologin'
In [36]: name, * fields, sh = line.split(":")
In [37]: name
Out[37]: 'nobody'
In [38]: sh
Out[38]: '/sbin/nologin'
7. 解壓迭代元素為可變長元組的序列
records = [
('foo', 1, 2),
('bar', 'hello'),
('foo', 3, 4),
]
def do_foo(x, y):
print('foo', x, y)
def do_bar(s):
print('bar', s)
for tag, *args in records:
if tag == 'foo':
do_foo(*args)
elif tag == 'bar':
do_bar(*args)
執(zhí)行結(jié)果:
foo 1 2
bar hello
foo 3 4
今兒就到這兒吧^_^
有任何問題加我微信: y86000153