首先簡單說明一下,python中按值傳遞與按引用傳遞的區別:
按值引數傳遞是指乙個變數的值來取代乙個函式引數的做法。如果這個值在函式**組中改變,對於呼叫這個函式的**來說,其中相應的變數值並不會受到任何影響,可以把這個引數認為是原變數值的乙個副本。
按引用引數傳遞是指對於呼叫這個函式的**,會維護這個**中變數的乙個鏈結(引用)。如果函式**組中的變數改變,那麼在呼叫這個函式的**中,相應的變數值也會改變,可以把這個引數認為是原變數的乙個別名。
def double(arg):
print('before:', arg)
arg = arg * 2
print('after:', arg)
num = 10
double(num)
print('num:', num)
saying = 'hello'
double(saying)
print('saying:', saying)
執行上述**,輸出結果如下:
before: 10分析after: 20
num: 10
before: hello
after: hellohello
saying: hello
每次呼叫都確認了作為引數傳入的值在函式**組已經改變,但是在函式外部print出來的值仍保持不變。
也就是說,函式引數看起來遵循按值呼叫語義。
def change(arg):
pring('before:', arg)
print('after:', arg)
numbers = [42, 256, 16]
change(numbers)
print(numbers)
執行上述**,輸出結果如下:
before: [42, 256, 16]分析after: [42, 256, 16, 『more data』]
numbers: [42, 256, 16, 『more data』]
這一次不僅函式中的引數值改變了,函式外部print出來的值也改變了。
看起來說明python函式也支援按引用呼叫語義。
根據具體情況,python的函式引數既支援按值傳遞也支援按引用傳遞。
實際上,直譯器會檢視物件引用(記憶體位址)指示的那個值的型別,如果變數指示乙個可變的值,就會按引用呼叫語義。如果所指示的資料的型別是不可變的,則會應用按值呼叫語義。
列表 字典 集合
總是會按引用傳入函式,函式**組中對變數資料結構的任何改變都會反映到呼叫**中。
字串 整數 元組
總是會按值傳入函式,函式中對變數的任何修改是這個函式私有的,不會反映到呼叫**中。
Python按值傳遞引數和按引用傳遞引數
python按值傳遞引數和按引用傳遞引數 按值傳遞引數 使用乙個變數的值 數字,字串 放到實參的位置上 注 傳遞過去的是變數的副本,無論副本在函式中怎麼變,變數的值都不變 傳遞常量 傳遞常量 定義乙個函式,輸出 歡迎,接收到的引數 name defhuanying name print 歡迎 nam...
函式引數傳遞方式 按值傳遞
基本資料型別賦值,是直接值發生了賦值,因此改變後,各自相互不影響。但是引用資料型別的賦值,是儲存在變數物件中的引用發生了賦值,因此複製之後的這兩個引用實際訪問的實際是同乙個堆記憶體中的值。當改變其中乙個時,另外乙個自然也被改變。第乙個是屬於基本型別賦值,a和b賦值完兩個就完事了,以後各走各的.第二個...
C 函式引數傳遞 按值和引用
c 中的資料型別.分值型別和引用型別兩大類.值型別 直接儲存資料的值,儲存在記憶體中的stack 堆疊 中 引用型別 儲存對值的引用,實際上儲存的就是乙個記憶體的位址.引用型別的儲存分成兩塊,實際值儲存在託管堆 heap 中.實際值的記憶體位址儲存在stack中 當使用引用型別時先找到stack中的...