日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python变量和变量赋值的几种形式

發(fā)布時(shí)間:2025/3/20 python 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python变量和变量赋值的几种形式 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

動(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)容了解即可):

  • 前綴并后綴雙下劃線的變量,如__name__,這種類型的變量在python中有特殊意義,屬于對(duì)象的內(nèi)置屬性,以后學(xué)了類和對(duì)象就知道了
  • 單下劃線前綴的變量,如_x,這類變量不會(huì)被from ModuleName import *的方式導(dǎo)入
  • 雙下劃線前綴的變量,如_x,這類變量是類的本地變量或稱為類的私有變量,它會(huì)擴(kuò)展成_classname_x
  • 除此之外,還有約定俗成的命名方式:

  • 常量以全大寫字符表示
  • 普通變量、函數(shù)名、方法名都以小寫字母開頭命名
  • 模塊名、包名以全小寫字母命名
  • 類名以大寫字母開頭
  • 因?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 = b

    python賦值時(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):

  • 因?yàn)樾蛄薪獍歉鶕?jù)元素位置來(lái)進(jìn)行賦值的,所以不能出現(xiàn)多個(gè)解包變量
  • 如果將序列直接賦值給單個(gè)解包變量時(shí)(即沒有普通變量),這個(gè)解包變量必須放在列表或元組中
  • a,*b,c,*d = L # 錯(cuò)誤 *a = L # 錯(cuò)誤 [*a] = L # 正確 (*a) = L # 正確

    之所以單個(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á)式可能比普通的賦值方式效率更高些。原因有二:

  • 二元賦值表達(dá)式中,a可能會(huì)是一個(gè)表達(dá)式,它只需計(jì)算評(píng)估一次,而a = a + 3中,a要計(jì)算兩次。
  • 對(duì)于可變對(duì)象,可以直接在原處修改得到修改后的值,而普通的一元賦值表達(dá)式必須在內(nèi)存中新創(chuàng)建一個(gè)修改后的數(shù)據(jù)對(duì)象,并賦值給變量
  • 第一點(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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。