我們知道c語言中只有值傳遞(位址也是值),c++中額外有引用傳遞,那麼在python中的引數是如何傳遞的呢,要理解這一點,我們就需要知道python傳遞的到底是什麼,在c/c++中有變數的概念,但是在python中是沒有這個概念的,在python的世界中,萬物皆物件
,我們可以通過名字
來操控這些物件,先來解釋以下這種思想:
>>
>a =
1>>
>b =
1>>
>
print(id
(a))
1526188160
>>
>
print(id
(b))
1526188160
>>
> a =
'***'
>>
> b =
'***'
>>
>
print(id
(a))
66453024
>>
>
print(id
(b))
66453024
>>
> a =[1
,2,3
]>>
> b =[1
,2,3
]>>
>
print(id
(a))
66536472
>>
>
print(id
(b))
66552376
>>
> a =(1
,2,3
)>>
> b =(1
,2,3
)>>
>
print(id
(b))
66372792
>>
>
print(id
(a))
66372712
>>
> a =
>>
> b =
>>
>
print(id
(a))
66565824
>>
>
print(id
(b))
66570592
>>
> b =(1
,2,3
)>>
> a = b
>>
>
print(id
(a))
66372712
>>
>
print(id
(b))
66372712
通過上面的測試,我們發現對於數值和字串常量,只要值是相同的,那麼它們的名字的id就是相同的,但是對於列表,元組,字典等即使它們值是一樣,它們的id也是不同的,但如果是通過賦值操作,它們的id便是相同的,通過上面我們得出階段性結論:在python中,萬物皆物件,通過名字操作物件,乙個物件可以被多個名字關聯,乙個名字只能關聯乙個物件。
有了上面的理解,我們應該已經大概知道python中的引數傳遞是怎麼回事了,下面來具體解釋看一下
def
function
(args)
:print(id
(args)
)a =
function(a)
print(id
(a))
ps c:\users\jiage\desktop\python\venv> python .\test.py
18892240
18892240
我們傳遞乙個列表名字給函式,我們可以看到函式內部的名字args和外部的名字a指向同乙個列表,下面我們試圖在函式內部改變這個列表內容。
def
function
(args):2
)a =
function(a)
print
(a)
下面是執行結果
ps c:\users\jiage\desktop\python\venv> python .\test.py[2
]
可以看到,函式內部的操作影響到了外部的列表a,這說明,利用任何物件的任何乙個標籤都可以改變物件的值(首先這個物件得是可變物件),上面的一切都符合我們的預期,但是下面有點不一樣。
下面我們傳遞乙個數值物件進去看看
def
function
(args)
:print(id
(args)
)a =
0function(a)
print(id
(a))
ps c:\users\jiage\desktop\python\venv> python .\test.py
1526188144
1526188144
彷彿也沒什麼問題,內部的名字args還是與a指向同乙個物件,接著看
def
function
(args)
: args =
1print(id
(args)
)a =
0function(a)
print(id
(a))
print
(a)
ps c:\users\jiage\desktop\python\venv> python .\test.py
1526188160
1526188144
0
我們發現,當給args賦值後,args就與a指向的物件不同了,按照我們前面的設想,這時候它們應該還是一樣的,而且a的值應該變成1,但這時候a卻沒有變,這是怎麼回事呢?經過調查,我發現,語言在設計之初就不希望常量物件被改變,所以我們是無法通過標籤來改變乙個記憶體中的數值的,我們只能把這個標籤貼到另乙個常量物件上,這與c/c++是不同的,c/c++是實實在在地通過指標改變了對應儲存單元的內容。
說到這裡,上面的現象也就不難理解了,當我們把a賦值給args後,如果我們沒有給args賦值,那麼我們可以照常引用a的值,但是一旦我們給args重新賦值之後,args就相當於從a指向的物件上撕了下來貼到了另乙個新的物件上,所以它之後就和a完全沒有關係了。 python中的引數傳遞
begin 前面在介紹python的六大資料型別的時候提到根據資料可變和不可變進行的資料型別分類 python3 的六個標準資料型別中 不可變資料 3 個 number 數字 string 字串 tuple 元組 可變資料 3 個 list 列表 dictionary 字典 set 集合 pytho...
Python 中引數的傳遞
學習 python 中,對 python 中的引數傳遞存有疑惑,想知道傳遞的是乙份拷貝還是引用位址,於是測試一番。個人理解,如有誤請指出。print 列表 def listchanged a 列表 同一引用 a 0 2 print id a a 1 print 呼叫函式前 str a listcha...
python 引數傳遞 Python 引數傳遞
python中的變數 乙個變數是區域性還是全域性,在編譯函式的時候就已經決定,因此讀變數值的時候也不會逐層向外查詢。變數是全域性還是局域,根據如下3條 1.如果函式內部有global語句,那麼它宣告的變數是全域性的。2.如果函式內部有對變數的賦值語句,那麼它是局域的。3.除此之外都是全域性的。注意1...