測試環境為 CentOS 8 x86_64 (虛擬機)
在 Python 所有的東西都是物件,所以沒有所謂的 Pass by value (傳入參數的值,原參數內容不會被改變) 或是 Pass by reference (傳入參數的參考,原參數內容會被改變).
Python 為 passes arguments by assignment , 要看傳入的物件是否為 Immutable 或是 Mutable .
- Immutable objects – 物件被創造出來後其值無法做改變像是 int , float , string , tuple 這些物件.
- Mutable objects – 物件被創造出來後其值可以做改變像是 list , dict , set 這些物件.
可以直接來看以下範例,參考文章 – https://docs.python.org/3/faq/programming.html#how-do-i-write-a-function-with-output-parameters-call-by-reference
[root@localhost ~]# python3 Python 3.6.8 (default, Mar 25 2022, 11:15:52) [GCC 8.5.0 20210514 (Red Hat 8.5.0-10)] on linux Type "help", "copyright", "credits" or "license" for more information.
- Immutable 物件範例 : int 與 string
>>> def func1(a, b): ... a = 'new-value' ... b = b + 1 ... return a, b ... >>> x, y = 'old-value', 99 >>> func1(x, y) ('new-value', 100) >>> print (x,y) old-value 99
說明:
因為 int 與 string 為 Immutable 物件,所以值被創造出來後是無法做改變.但我們不是常透過 = (等於) 去修改值嗎?看下面的範例說明. - Immutable 物件範例
>>> a = 1000 >>> print(id(a)) 140567915885648 >>> a=a+1 >>> print(id(a)) 140567915885264
說明:
上面範例可以看到 a 的 ID 在 = (等於) 修改值之後變了.這是因為當我們修改 a 時並不會去改這個物件的值而建立一個新的 int 物件出來,這個稱為Immutable objects. - Mutable 物件範例 : list
>>> def func2(a): ... a[0] = 'new-value' ... a[1] = a[1] + 1 >>> args = ['old-value', 99] >>> func2(args) >>> args ['new-value', 100]
說明:
因為 list 為 Mutable 物件,所以物件被創造出來後其值可以做改變.從下面範例可以更清楚了解. - Mutable 物件範例
>>> b = [1,2] >>> print(id(b)) 140567916100744 >>> b.append(3) >>> print(id(b)) 140567916100744
說明:
b 為 list (Mutable 物件) 在修改後其記憶體位置並不會改變. - 範例 : Mutable 物件範例 : dictionary
>>> def func3(args): ... args['a'] = 'new-value' ... args['b'] = args['b'] + 1 ... >>> args = {'a': 'old-value', 'b': 99} >>> func3(args) >>> args {'a': 'new-value', 'b': 100}
說明:
可以看出來 dictionary 為 Mutable 物件. - 範例 : Class
[root@localhost ~]# vi dict.py class Namespace: def __init__(self , **args): for key, value in args.items(): setattr(self, key, value) def func4(args): args.a = 'new-value' args.b = args.b + 1 args = Namespace(a='old-value', b=99) print((args)) print(vars((args))) func4(args) print('--------------') print((args)) print(vars((args)))
執行結果
[root@localhost ~]# python3 dict.py <__main__.Namespace object at 0x7fc248a9bf98> {'a': 'old-value', 'b': 99} -------------- <__main__.Namespace object at 0x7fc248a9bf98> {'a': 'new-value', 'b': 100}
說明:
在 class 傳入的 dictionary 為 Mutable 物件,其記憶體位置並不會改變.
沒有解決問題,試試搜尋本站其他內容