<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Python 中 a=a+b 與 a+=b 有什么不同?

          共 1650字,需瀏覽 4分鐘

           ·

          2021-08-11 09:50

          只要熟悉 Python,那么你肯定知道 a=a+ba+=b 都可以實(shí)現(xiàn)對(duì)對(duì)象 a 的自增操作,可以除此之外,他們有什么不同呢?如果這個(gè)是面試題,你會(huì)怎么回答呢?

          如果你說(shuō) a+=ba=a+b 的簡(jiǎn)單寫(xiě)法,那你只說(shuō)對(duì)了一半,你還沒(méi)有弄清楚 += 這種操作符的真正含義。

          這兩種操作的結(jié)果都是 a=a+b, 但左邊的 a 和 右邊的 a 還是同一個(gè)對(duì)象么?當(dāng)弄不清楚的時(shí)候,我們可以在 Python 解釋器中試驗(yàn)一下。

          >>> a = 1
          >>> id(a)
          4420422336
          >>> a = a + 2
          >>> id(a)
          4420422400
          >>>
          >>> a = 1
          >>> id(a)
          4420422336
          >>> a += 2
          >>> id(a)
          4420422400
          >>>

          可以看出,兩種方式之后,a 與原來(lái)的 a 的 id 不同,它們不再是同一個(gè)對(duì)象,也就是說(shuō)當(dāng) a 是數(shù)字的時(shí)候,a+=ba=a+b 的簡(jiǎn)單寫(xiě)法,那么當(dāng) a 是列表的時(shí)候呢?

           >>> a = [1]
          >>> id(a)
          140401184850560
          >>> a = a + [2]
          >>> id(a)
          140401184297216
          >>>
          >>> a = [1]
          >>> id(a)
          140401184850560
          >>> a += [2]
          >>> id(a)
          140401184850560
          >>>

          可以看出,當(dāng) a 是列表時(shí),a += b,中的 a 與原來(lái)的 a 的 id 是同一個(gè),說(shuō)明 a += b 并沒(méi)有創(chuàng)建新的對(duì)象,而 a = a+b 新創(chuàng)建了一個(gè)新的對(duì)象,創(chuàng)建對(duì)象是有成本的,因此在這種情況下, a+=b 的性能是比較高的,這一點(diǎn)可以驗(yàn)證:

          兩種方法都執(zhí)行 10 萬(wàn)次時(shí),性能相差 1900 倍。

          總結(jié)一下,對(duì)不可變對(duì)象, a+=b 就是 a=a+b 的簡(jiǎn)單寫(xiě)法,比如數(shù)字,字符串,元組。請(qǐng)注意,元組也是可以 a+=b、a=a+b 的哦,元組的不可變,指的是這個(gè)元組指向的對(duì)象不可變,但是元組變量卻是可以指向新的元組的。

          對(duì)于可變對(duì)象,a+=b 在 a 的基礎(chǔ)上進(jìn)行自增,不創(chuàng)建新對(duì)象,而 a=a+b,創(chuàng)建了新的對(duì)象,然后再讓變量 a 指向這個(gè)新創(chuàng)建的對(duì)象,涉及創(chuàng)建對(duì)象的操作,因此性能較差??勺儗?duì)象有列表,字典,集合,類(lèi)似的,a=a*b 與  a*=b 也是一樣的,不過(guò)只有列表才支持 + 和 * 這種運(yùn)算符。

          最后的話

          現(xiàn)在你應(yīng)該明白了 a=a+ba+=b, a=a*ba*=b 的區(qū)別。對(duì)于列表而言,a*=ba*=b是在原有列表上原地進(jìn)行操作,不創(chuàng)建新的對(duì)象,性能會(huì)更高效。

          有時(shí)候越簡(jiǎn)單的問(wèn)題,越是被人忽略,卻藏著不少細(xì)節(jié),技術(shù)的道路上,細(xì)節(jié)是魔鬼,搞懂細(xì)節(jié),也是提升技術(shù)水平的方法。

          有收獲就點(diǎn)個(gè)贊吧,關(guān)注我,每天學(xué)習(xí)一個(gè) Python 技巧。

          瀏覽 25
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  18禁日韩 | 天天日天天干麻豆 | 欧美乱伦黄色 | 国产丝袜足交在线观看 | 免费无码一区二区在线观看 |