python变量和变量赋值的几种形式
動(dòng)態(tài)類型的語(yǔ)言
python是動(dòng)態(tài)類型的語(yǔ)言,不需要聲明變量的類型。
實(shí)際上,python中的變量?jī)H僅只是用來(lái)保存一個(gè)數(shù)據(jù)對(duì)象的地址。無(wú)論是什么數(shù)據(jù)對(duì)象,在內(nèi)存中創(chuàng)建好數(shù)據(jù)對(duì)象之后,都只是把它的地址保存到變量名中。所以變量名是類型無(wú)關(guān)的,但它指向的值是類型相關(guān)的,可以是數(shù)值、字符串、列表、函數(shù)、類、對(duì)象等等。這些內(nèi)存對(duì)象中都至少包含3部分:對(duì)象類型、對(duì)象的引用計(jì)數(shù)(用來(lái)判斷改對(duì)象是否可被垃圾回收器回收)、對(duì)象的值。
因此,a = 3中,變量名a保存的是數(shù)據(jù)對(duì)象3的地址,之后可以為其賦值一個(gè)字符串a(chǎn) = “hello”,這時(shí)a保存的是"hello"字符串的地址。在這個(gè)類型改變的過程中,a僅僅只是修改了一下地址而已。
變量的命名風(fēng)格
python中的變量命名時(shí)只能包含數(shù)字、大小寫字母、下劃線這三種類型的字符,并且數(shù)字不能是首字符。
還有一些有特殊意義的變量命名方式(目前這些內(nèi)容了解即可):
除此之外,還有約定俗成的命名方式:
因?yàn)橹皇羌s定俗成,所以沒有強(qiáng)制限制。
變量賦值的幾種形式細(xì)節(jié)
本文解釋python中變量賦值的形式,并解釋一些細(xì)節(jié)。后面還有一篇文章解釋python中按引用賦值的文章。
python中變量賦值的幾種形式。
x = "long" # (1).基本形式 x, y = "long", "shuai" # (2).元組對(duì)應(yīng)賦值 [x, y] = ["long", "shuai"] # (3).列表對(duì)應(yīng)賦值 a, b, c, d = "long" # (4).序列賦值 a, *b = 'long' # (5).解包賦值 a = b = "long" # (6).多目標(biāo)賦值 a += 3 # (7).二元賦值表達(dá)式 ((a, b), c) = ('lo','ng') # (8).嵌套賦值序列注意:python的數(shù)值是不可變對(duì)象,無(wú)法在原處修改數(shù)據(jù),所以不支持自增、自減。
a++ ++a a-- --b其中(1)-(3)無(wú)需過多解釋,唯一需要注意的是,當(dāng)使用逗號(hào)的時(shí)候,python總會(huì)臨時(shí)或永久地建立成tuple來(lái)保存元素,所以x, y = "long", "shuai"在內(nèi)部完全等價(jià)于(x, y) = ("long", "shuai")。
實(shí)際上,列表元素也可以賦值給元組,或者元組賦值給列表,只要兩邊的序列元素個(gè)數(shù)能對(duì)應(yīng),無(wú)所謂左右兩邊的序列類型:
''' 遇到問題沒人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流QQ群:531509025 尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和PDF電子書! ''' >>> (x,y) = (1,2) >>> (x,y) = [1,2] >>> [x,y] = (1,2) >>> [x,y] = [1,2] >>> (x,y) = 'ab' >>> [x,y] = 'ab'對(duì)于(4)賦值方式,是序列賦值的行為,在python中,只要是序列,都可以這樣賦值。正如這里的變量賦值情況等價(jià)于:
a = "l" b = "o" c = "n" d = "g"如果換成其它的序列也一樣。例如:
a, b, c, d = ("shell","perl","php","python") a, b, c, d = ["shell","perl","php","python"]但是變量和序列中的元素必須一一對(duì)應(yīng)。如果變量名與元素個(gè)數(shù)不同,則會(huì)報(bào)錯(cuò),除非只有一個(gè)變量名,這表示將整個(gè)序列賦值給這個(gè)變量。
如果想要將序列中的元素賦值給不等的變量,可以考慮先將序列進(jìn)行切片。
>>> str='long' >>> a, b, c = list(str[:2]) + [str[2:]] >>> a,b,c ('l', 'o', 'ng')(5)的賦值方式則正好是讓變量名少于元素個(gè)數(shù)的方式。這種賦值形式稱為序列解包(下文會(huì)專門解釋這種賦值方式),多出來(lái)的元素會(huì)全部以列表的方式賦值給最后一個(gè)變量名。正如這里等價(jià)于:
a="l" b=["o", "n", "g"]下面兩種賦值方式得到的結(jié)果是一樣的,a是字符串,b是列表,b都包含3個(gè)元素:
a, *b = ("shell","perl","php","python") a, *b = ["shell","perl","php","python"]賦值的結(jié)果:
shell ['perl', 'php', 'python'](6)的賦值方式等價(jià)于:
b = "long" a = bpython賦值時(shí),總是先計(jì)算"=“右邊的結(jié)果,然后將結(jié)果按照賦值方式賦值給”="左邊的變量。所以,這里的過程是先將"long"賦值給變量b,再將b賦值給變量a。
因?yàn)榭偸窍扔?jì)算右邊,所以交換變量非常的方便。
''' 遇到問題沒人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流QQ群:531509025 尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和PDF電子書! ''' a, b = "a", "b"# 交換: a, b = b, a# 交換結(jié)果: a = "b" b = "a"(7)的賦值方式a += 3在結(jié)果上等價(jià)于a = a + 3,在其它語(yǔ)言中這兩種賦值方式是完全等價(jià)的,但在python中這種增強(qiáng)賦值的方式要比后者更高效率些,為什么效率要高一些,下文會(huì)稍作解釋。在很大程度上來(lái)說(shuō),Python中只要是簡(jiǎn)化的形式,基本上都比更復(fù)雜的等價(jià)形式效率更高。
(8)的賦值方式((a, b), c) = (‘lo’, ‘ng’)是將序列進(jìn)行嵌套序列賦值,將’lo’賦值給元組(a, b),'ng’賦值給c,元組又進(jìn)一步賦值a=‘l’, b=‘o’。這種賦值方式在python中很好用,特別是在表達(dá)式中賦值的時(shí)候,比如for循環(huán)和函數(shù)參數(shù):
for (a, b, c) in [(1, 2, 3), (4, 5, 6)]:... for ((a, b), c) in [((1, 2), 3), ((4, 5), 6)]:...def f(((a, b), c)):... f(((1, 2), 3))關(guān)于序列解包
在前面簡(jiǎn)單介紹了一下序列解包:
a, *b = 'long'當(dāng)使用一個(gè)*前綴變量的時(shí)候,表示將序列中對(duì)應(yīng)的元素全部收集到一個(gè)列表中(注意,總是一個(gè)列表),這個(gè)列表名為*開頭的那個(gè)變量名。*號(hào)可以出現(xiàn)在任意位置處,只要賦值的時(shí)候能前后對(duì)應(yīng)位置關(guān)系即可。
注意其中的幾個(gè)關(guān)鍵字:序列、對(duì)應(yīng)的元素、列表
- 序列意味著可以是列表、元組、字符串等等
- 列表意味著只要收集不報(bào)錯(cuò),賦值給解包變量的一定是一個(gè)列表
- 對(duì)應(yīng)的元素意味著可能收集到0或任意個(gè)元素到列表。
不管如何,收集的結(jié)果總是列表,只不過可能是空列表或者只有一個(gè)元素的列表。
例如:
L = ['aa','bb','cc','dd'] a, *b = L # a='aa',b=['bb','cc','dd'] a, b, *c = L # a='aa',b='bb',c=['cc','dd'] a,*b,d = L # a='aa',d='dd',b=['bb','cc'] *a,d = L # a=['aa','bb','cc'],d='dd' a,b,c,*d = L # a='aa',b='bb',c='cc',d=['dd'] a,b,c,d,*e = L # a='aa',b='bb',c='cc',d='dd',e=[]兩個(gè)注意事項(xiàng):
之所以單個(gè)解包變量時(shí)必須放在元組或變量中,看下面兩個(gè)等價(jià)的例子就很容易理解了:
a, *b = L (a, *b) = L最后,序列解包是切片的便捷替代方式。能用序列解包的,都能用切片來(lái)實(shí)現(xiàn),但切片要輸入額外的各種字符。例如:
a,b,c = L[0],L[1],L[2:] a,b,*c = L需要注意,解包返回的一定是列表,但序列切片返回的內(nèi)容則取決于序列的類型。例如下面元組的切片返回的是元組,而不是列表:
''' 遇到問題沒人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流QQ群:531509025 尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和PDF電子書! ''' >>> T=('aa','bb','cc','dd') >>> a,b,c = T[0],T[1],T[2:] >>> a,b,c ('aa', 'bb', ('cc', 'dd'))二元賦值表達(dá)式
python支持類似于a += 3這種二元表達(dá)式。比如:
a += 3 -> a = a + 3 a -= 3 -> a = a - 3 a *= 3 -> a = a * 3 ...在python中的某些情況下,這種二元賦值表達(dá)式可能比普通的賦值方式效率更高些。原因有二:
第一點(diǎn)無(wú)需解釋。關(guān)于第二點(diǎn),看下面的例子:
L = [1,2,3] L = L + [4] # (1):慢 L += [4] # (2):快 L.append(4) # (3):快,等價(jià)于(2)L = L + [5,6] # (4):慢 L += [5,6] # (5):快 L.extend([5,6]) # (6):快,等價(jià)于(5)對(duì)于上面(1)和(4)的一元賦值表達(dá)式,先取得L,然后創(chuàng)建一個(gè)新的列表對(duì)象,將L拷貝到新列表對(duì)象中,并將4或5,6放進(jìn)新列表對(duì)象,最后賦值給L。這個(gè)過程中涉及到了幾個(gè)步驟:新分配內(nèi)存、內(nèi)存中列表拷貝、放入新數(shù)據(jù)。
而(2)(3)是等價(jià)的,(5)(6)也是等價(jià)的,它們都是直接在內(nèi)存中的原始列表處修改,不會(huì)有拷貝操作,新建的數(shù)據(jù)對(duì)象僅僅只是一個(gè)元素。
按照理論上來(lái)說(shuō),確實(shí)二元賦值方式要效率高一些,但要注意的是,列表中保存的只是各元素的引用,所以拷貝列表也僅僅只是拷貝一點(diǎn)引用,這是微乎其微的開銷。所以一元賦值和二元賦值的差距在這一點(diǎn)的性能上基本沒差距,主要的差距還在于一元、二元賦值方式可能存在的表達(dá)式不同評(píng)估次數(shù)。
總的來(lái)說(shuō),使用二元賦值表達(dá)式通常可以作為可變對(duì)象賦值的一種優(yōu)化手段。
總結(jié)
以上是生活随笔為你收集整理的python变量和变量赋值的几种形式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python基础教程:列表解析
- 下一篇: Python丢弃返回值