Python – passes arguments by assignment

測試環境為 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 物件,其記憶體位置並不會改變.

沒有解決問題,試試搜尋本站其他內容

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料