Pythonパラメータ伝達の実現過程と原理の詳細


pythonのパラメータ伝達がどのように行われるかを分析する前に、まずpython変数と割当値の基本原理を知る必要があります。
python変数と値付け
数値
何行のコードから開始しますか?

In [1]: a = 1
In [2]: b = a
In [3]: a = a + 1
私たちはまず1賦をaにあげます。つまりaは1という対象を指しています。pythonでは全て対象です。b=aに続くと、bにも1というオブジェクトを指し示し、pythonのうちの1つのオブジェクトは複数の参照によって指し示すことができる。最後に実行されるa=a+1は、ここで注意すべき点として、pythonのデータタイプにはint、strなどの可変タイプではなく、執a=a+1という動作は、aを指すオブジェクトの値を1だけ増加するのではなく、新たなオブジェクト2を生成し、aを2というオブジェクトを指すものであり、元のオブジェクトはメモリにも存在する。ここはやはり指さされます。aとbの値を見ましょう。

In [4]: a
Out[4]: 2

In [5]: b
Out[5]: 1
この例では、ここのaとbは、最初は同じオブジェクトを指す変数の2つだけです。または、同じオブジェクトの2つの名前を想像することもできます。単純な割当値b=aは、新たなオブジェクトを作成したという意味ではなく、同じオブジェクトを複数の変数に指向または参照させるだけです。同時に、同じオブジェクトを指しても、2つの変数が一緒に結合されるという意味ではありません。変数の一つに値を再割り当てすると、他の変数の値には影響しません。
リスト
もう一つのリストの例があります。

In [6]: l1 = [3,4,5,6]
In [7]: l2 = l1
In [10]: l1.append(7)
In [11]: l1
Out[11]: [3, 4, 5, 6, 7]
In [12]: l2
Out[12]: [3, 4, 5, 6, 7]
コードの中で、私達はl 1とl 2の両方の変数を[3,4,5,6]というオブジェクトを指しています。リストは可変のデータ構造であることを知っています。だから、appnd操作は新しいオブジェクトを生成しません。最後に元素を追加しただけで、[3,4,5,6,7]となり、l 1とl 2が同時にこのリストを指します。したがって、リストの変化はl 1とl 2の両方の変数に同時に反映されます。すると、l 1とl 2の値は同時に[3,4,5,6,7]に変わります。
オブジェクトの削除
pythonでは変数は削除できますが、対象は削除できません。
In[22]:a=[1,4,5]
In[23]:del a
del文はaという変数を削除すると、aを通じて[1,4,5]にアクセスできませんが、このオブジェクトはまだ存在しています。pythonのゴミ回収メカニズムは0を参照すると回収されます。
締め括りをつける
  • 変数の割当値は、変数があるオブジェクトを指しているだけで、コピー対象が変数に与えられていることを表していません。一方のオブジェクトは、複数の変数によって
  • を指すことができます。
  • 可変オブジェクト(リスト、辞書、集合など)の変更は、オブジェクトを指すすべての変数に影響を与える。
  • は、可変オブジェクト(文字列、整数、タプルなど)に対して、オブジェクトを指すすべての変数の値が常に同じであり、変更されない。しかし、いくつかの操作(+=など)によって可変オブジェクトの値が更新されると、新しいオブジェクト
  • が返されます。
  • 変数は削除できますが、オブジェクトは削除できません。
  • python関数はどのようにパラメータ伝達を行いますか?
    pythonのパラメータ伝達は、赋価伝達または引用伝達、python内のすべてのオブジェクトですので、パラメータ伝達時には、新しい変数と元の変数が同じオブジェクトを指しているだけです。以下の例を見ます。
    
    In [28]: def func(b):
      ...:   b = 2
    
    In [29]: a = 1
    
    In [30]: func(a)
    
    In [31]: a
    Out[31]: 1
    ここでのパラメータ伝達は、変数aとbを同時に1というオブジェクトに向けたものです。しかし、b=2まで実行すると、システムは新たに2の値を持つ新しいオブジェクトを作成し、bを指します。aは依然として1という対象を指す。したがって、aの値は変わらず、依然として1である。
    aの値はどう変えますか?
    関数でbを返します。
    
    def func(b):
      b = 2
      return b
    a = 1
    a = func(a)
    a
    2
    上記の例はintタイプです。リストの例を見てみます。
    
    def func(l2):
      l2.append(77)
    
    l1 = [12,3,6]
    func(l1)
    l1
    [12,3,6,77]
    ここでl 1とl 2は、まず同時に値が[1,2,3]のリストを指します。ただし、リストが可変なので、apped()関数を実行し、その末尾に新しい要素4を加えると、変数l 1とl 2の値も変化します。
    次の例を見て、結果は何ですか?
    
    def func(l2):
      l2 = l2 + [4]
    
    l1 = [12,3,6]
    func(l1)
    l1
    [12,3,6]
    l 1が変化していないのは、l 2+[4]という動作表現が要素4の新しいリストに末尾を入れて、l 2がこの新しいオブジェクトを指しているからです。l 1は元のオブジェクトを指しています。
    締め括りをつける
    今日はPythonの変数とその賦値の基本原理を論じ,Pythonにおけるパラメータの伝達を説明した。他の言語と違って、Pythonにおけるパラメータの伝達は、値伝達でも引用伝達でもなく、値伝達でもあり、または対象と呼ばれる引用伝達でもあります。ここでは、特定のメモリアドレスを指すのではなく、特定のオブジェクトを指すことに注意したい。
    以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。