Python中的a+=a和a=a+a的區別(認真看完后,我相信你一定會回來感謝我的)

一、先來兩段代碼!

a = 100def beyond(num):num+=numprint(num)beyond(a)#結果為:200
print(a)#結果為:100
a = 100def beyond(num):num=num+numprint(num)beyond(a)#結果為:200
print(a)#結果為:100

通過這兩段代碼的結果可以看出,最終的結果和大家想的完全一樣。
但事實這兩段代碼是完全等價的嘛?答案是否定的,要是是完全一樣我寫這篇博客閑著沒事干哈。
廢話不多說,下面進入正題。

在Python中列表字典是可變數據類型;可變數據類型在定義字典的時候是不可以當key的,可以當value,因為key有個hash過程。

如果一個變量指向一個全局變量,那么想要修改這個全局變量,就得看下這個全局變量是不是可變數據類型。以這兩段代碼為例,a=100,這里變量a指向全局變量100,需要修改100,得看下100這個整型數是不是可變數據類型。很顯然,不是!

分析一下程序執行過程:
①a = 100 #先定義一個內存空間1存儲100,變量a指向這個列表1
②def beyond(num): #程序運行到這里時,系統已明確這個函數需要有一個參數,由于Python是動態語言(第四部分中有解釋),故此時尚未清楚這個函數具體實現的功能是什么。
③beyond(a) #這里變量a指向誰,也會將函數中形參num也指向誰,這里均指向內存空間1
④當程序運行到函數beyond(num)時,:

  1. 若num+=num #其實遇到+=是有兩個過程要完成
    1,首先判斷能否對這個num值進行修改,即判斷num是否是可變數據類型;若能修改直接在num上修改
    2,若不能修改則需要重新定義一個變量,讓這個變量再重新指向這個值;即系統會重新定義內存空間2,用來存放num+num的值。即此時的num指向內存空間2,內存空間2存放num+num的值。
  2. 若num=num+num #遇到=直接重新定義一個變量,讓這個變量再重新指向這個值;即系統會重新定義內存空間2,用來存放num+num的值。即此時的num指向內存空間2,內存空間2存放num+num的值。

⑤print(num)
⑥print(a)

若為num = num + num 即先算等號右邊,會的到一個臨時的答案,得到這個臨時的答案相當于在內存中額外開辟了一塊內存;等號左邊則會指向這個額外開辟內存而已,所以a所指向的那塊地方沒有任何的變化,只不過在函數里面發生了變化,而在函數外面a的值并未發生任何變化。

到這里是不是有那么一點略懂了?哈哈哈,來繼續深入一點!

二、再來兩段代碼!

a = [100]def beyond(num):num+=numprint(num)beyond(a)#結果為:[100, 100]
print(a)#結果為:[100, 100]

上述代碼,很明顯,遇到num+=num,其實說白了直接看+=就行,遇到+=先判斷num是否可以修改,很顯然,a指向列表1,存放[100],列表是可變數據類型,直接再列表1中進行了修改,a指向列表1,num指向列表1,而指向+=操作的時候是直接針對的列表1操作的,故a和num的最終值都是已經改變之后的值,即[100,100]。

a = [100]def beyond(num):num=num+numprint(num)beyond(a)#結果為:[100, 100]
print(a)#結果為:[100]

而這段代碼,a = [100],系統會為列表100分配內存空間,變量a會指向這個內存空間;接著是是num=num+num,系統會重新分配一個新的內存空間,存放num+num運算結果,num最終指向這個新的內存空間。a所指向的內存空間存放列表[100],而num指向的新的內存空間存放的是num+num的結果即[100,100]。這些輸出結果就可想而知了吧~

總結:num+=num并不等價于num=num+num,若是數字,答案是一樣的,但是真正的原理并不相同。因為Python語言當中,并不是值賦值,而是引用。所有的只要牽涉到等號,統統都是引用,

好了,到此結束,是不是有那么一丟丟感覺了?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/378416.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/378416.shtml
英文地址,請注明出處:http://en.pswp.cn/news/378416.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

安裝linux后win7引導程序,安裝Windows7+Ubuntu+CentOS三系統之后的引導問題

依次安裝了Windows7、Ubuntu12.04、CentOS6.3系統后,開機引導項只有CentOS和Other(即Windows7)兩個選項,無法進入Ubuntu系統,所以利用Ubuntu的LiveCD光盤啟動后進行如下操作對grub進行修復,步驟如下:啟動Live CD&#…

Web之神php

我開始學習做網頁的時候用的是asp,后來轉行用php。以前只知道php很好學,并且很方便。我學習php的時候關于php的書種類很少好像那時候我在當當上面只看到3本,跟現在沒法比,現在大家再學習php就簡單多了,那么多書那么多資料。 現在我…

python與tensorflow知識點截圖集錦(持續囤積)

目錄前言conda環境管理python語法【1】語言屬性【2】代碼縮進問題【3】input和output函數與print函數【4】關鍵字與簡單數據類型與簡單運算符【5】利用縮進體現邏輯關系【6】數據結構:列表與元組【7】數據結構:字典【8】數據結構:集合【8】基…

string concat_Java String concat()方法與示例

string concat字符串concat()方法 (String concat() Method) concat() is a String method in Java and it is used to concatenate (add) a given string to the string. It returns a concatenated string. concat()是Java中的String方法,用于將給定的字符串連接(…

第五章 染料結構對染色性能的影響單元測驗

?1,引起染料結構發生變化的因素有() 染料商品添加劑及方法。 染料合成中間體選擇及合成條件。 染色助劑。 染色溫度。 2,染料結構影響染色()性能 染色熱力學性能。 染色牢度。 染色動力學性能。 染色勻染性能。 3,染料精制除雜時,染液中加入的溶劑應該具有()性能 …

sql2008怎么轉移到sql2005

一般來說,最新版本會向下兼容,如果舊版本想用新版本則不行。 但是還是有一些辦法的,可以參考一下。-- 對象資源管理器(沒有的話按F8) 連接到你的2008實例--右鍵你要降級的數據庫-- 任務-- 生成腳本-- 在隨后出現的腳本中, 單擊"下一步&q…

字符搜索正則表達式語法詳解

工作之余抽點時間出來寫寫博文,希望對新接觸的朋友有幫助。明天在這里和大家一起學習一下字符搜索 作為一個術技,時常會到碰正則表達式相干的西東,很多時候忙著趕進度,都是在網上找一個可以決解的正則表達式,或是換另外…

gRPC之grpc resolver

1、grpc resolver 當我們的服務剛剛成型時,可能一個服務只有一臺實例,這時候client要建立grpc連接很簡單,只需要指定server 的ip就可以了。但是,當服務成熟了,業務量大了,這個時候,一個實例就…

linux測試固態硬盤讀寫速度,在 Linux 上檢測 IDE/SATA SSD 硬盤的傳輸速度

你知道你的硬盤在 Linux 下傳輸有多快嗎?不打開電腦的機箱或者機柜,你知道它運行在 SATA I (150 MB/s) 、 SATA II (300 MB/s) 還是 SATA III (6.0Gb/s) 呢?你能夠使用 hdparm 和 dd 命令來檢測你的硬盤速度。它為各種硬盤的 ioctls 提供了命…

stl標準模板庫_C ++標準模板庫(STL)中的array :: fill()

stl標準模板庫fill() is a member function of "array container", which sets a given value to all array elements. It can also be used to set the value to other of containers also. Value type should be same as container type. fill()是“數組容器”的成…

Opencv——批量處理同一文件夾下的圖片(解決savedfilename = dest + filenames[i].substr(len)問題)

文章目錄前言一、完整代碼二、實現效果前言 第一份代碼實現了批量修改同一文件夾下圖片的尺寸,有其他需求時僅需修改處理部分的代碼以及文件夾路徑。 第二份代碼實現了批量截取同一文件夾下每張圖片的ROI區域作為結果保存,注意截取后按下enter鍵才會跳到…

linux統計文件目錄及其文件個數

linux下統計目錄及其子目錄的文件的個數 查看某目錄下文件的個數 ls -l |grep "^-"|wc -l或find ./company -type f | wc -l 查看某目錄下文件的個數,包括子目錄里的。 ls -lR|grep "^-"|wc -l查看某文件夾下目錄的個數,包括子目錄里…

處理文件、攝像頭和圖形用戶界面

1、基本I/O腳本 1.1 讀/寫圖像文件 import numpy import cv2#利用二維Numpy數組簡單創建一個黑色的正方形圖像 img numpy.zeros((3,3),dtypenumpy.uint8) img #結果為:array([[0, 0, 0],[0, 0, 0],[0, 0, 0]], dtypeuint8)img.shape#結果為:(3, 3)###…

linux桌面天氣,Ubuntu 14.10中安裝和配置天氣應用

對于操作系統平臺而言,有各種小插件功能方便用戶日常應用。在Ubuntu桌面中提供天氣信息的功能,可以使用Unity Dash和桌面應用來獲得相關信息,比如Typhoon。但對于用戶而言,可以提供快速查詢天氣狀況和溫度數據,并且只需…

使用ACE_SOCK_SEQPACK_Association獲取socket連接的本地及遠程IP端口信息

int connect(const std::string& ip, int port){ ACE_INET_Addr portAddr(port, ip.c_str()); ACE_SOCK_Connector connector; ACE_SOCK_Stream peer; if (-1 connector.connect(peer, portAddr)) { std::cout << "連接服務器(" <&…

linux批處理操作系統_批處理操作系統

linux批處理操作系統批處理操作系統 (Batch Processing Operating System) When we are working in an environment there is a restriction of making use of computer resources effectively and improvement in the programmers output. When we are working with tapes a l…

STL容器及其簡單應用(stack、priority_queue、vector、deuqe、list、map/multimap、set/multiset)

目錄前言【1】stack操作以及應用stack的幾個核心接口利用stack完成進制轉換【2】priority_queue操作以及應用priority_queue的幾個核心接口利用priority_queue完成合并果子問題【3】vector操作以及應用vector的幾個核心接口利用vector完成隨機排序【4】deuqe(雙向隊列)操作以及…

Android SAX API: XmlResourceParser及其擴展應用

XmlResourceParser繼承了2個接口&#xff1a;AttributeSet和XmlPullParser。其中XmlPullParser定義了Android SAX框架。跟Java 的SAX API相比&#xff0c;XmlPullParser令人難以置信地簡單。 一、使用XmlResourceParser讀取資源束中的xml 資源束是應用程序編譯后的應用程序包…

linux fdisk 磁盤空間使用率,linux查看磁盤剩余空間以及cpu使用情況

1、查看CPU個數cat /proc/cpuinfo | grep "physical id" | uniqtop可以實時的查看cpu的使用情況2、查看CPU核數cat /proc/cpuinfo | grep "cpu cores" | uniq3、查看CPU型號cat /proc/cpuinfo | grep model name |uniq4、查看內存cat /proc/meminfo | grep…

c語言 函數的參數傳遞示例_restder()函數,帶有C ++中的示例

c語言 函數的參數傳遞示例C restder()函數 (C remainder() function) remainder() function is a library function of cmath header, it is used to calculate the remainder (IEC 60559), it accepts two parameters (numerator and denominator) and returns the remainder…