Python3.6.4 の関数内の変数に関して、インプレースで変更される場合とそうでない場合の違いは？


できる限り同条件で比較できるコードにしたつもりなのですが、何度やってもリストはインプレースで書き換えられてしまいます。なぜなのでしょうか？「リストの代わりにタプルを使うべき」以外の回答だとありがたいです。

また、初の質問投稿であるため、無作法な点もあるかと思うので、その点の指摘があるとなお助かります。よろしくお願いします。

[code]

    >>> lst,a = [0],0
    >>> def test1(lst):
        try:
            _ = lst
            _[0] = 1
        except:
            pass
        return _
    >>> def test2(x):
        try:
            b = a
            b = 1
        except:
            pass
        return b
    >>> test1(lst)
    [1]
    >>> lst
    [1]　#ここが0のままであってほしい
    >>> test2(a)
    1
    >>> a
    0
    
[/code]




質問のコードでは`id(test1(lst))`と`id(lst)`は同一であり同じものを指しています。  
質問のコードを下記のようにすると良いでしょう。

[code]

    def test1(lst):
        try:
            _ = lst.copy()
            _[0] = 1
        except:
            pass
        return _
    
[/code]

