動的型付けは、Python のもう 1 つの重要な中心概念です。前に述べたように、Python 変数は宣言する必要がなく、値を代入するときに変数を任意の値に再代入できます。これらはすべて動的型付けの概念に関連しています。
ダイナミック型
私たちが接触するオブジェクトの中には、データを保存するために使用される特別なタイプのオブジェクトがあります。このタイプの一般的なオブジェクトには、さまざまな数値、文字列、テーブル、辞書が含まれます。 C言語では、このようなデータ構造を変数と呼びます。 Python では、これらはオブジェクトです。
オブジェクトはメモリに保存されるエンティティです。ただし、オブジェクトに直接アクセスすることはできません。プログラムに記述するオブジェクト名は、このオブジェクトへの単なる参照です。
参照とオブジェクトの分離は動的型の中核です。参照はいつでも新しいオブジェクトを指すことができます:
2 番目のステートメントでは、文字列であるオブジェクト「at」がメモリ内に作成されます。 a は「at」を指します。この時点で、オブジェクト 3 はそれへの参照を失います。 Python は参照されていないオブジェクトを自動的に破棄 (破壊) し、対応するメモリを解放します。
(小さな整数や短い文字列の場合、Python はこれらのオブジェクトを頻繁に作成および破棄する代わりにキャッシュします。)
他のデータ オブジェクトについても同様です:
ただし、次の状況には注意してください
その理由は何ですか? L1 と L2 のポイントは変更されていないため、依然としてそのテーブルをポイントしています。テーブルは実際には複数の参照を含むオブジェクトです (各参照は L1[0]、L1[1]... などの要素であり、各参照は 1、2、3 などのオブジェクトを指します)。 L1[0] = 10 の代入操作は L1 のポイントを変更しませんが、テーブル オブジェクト (要素) の一部である L1[0] に対して操作するため、そのオブジェクトを指すすべての参照がすべて影響を受けます。
(対照的に、以前の代入操作はオブジェクト自体には影響を与えず、参照点を変更しただけでした。)
リストは、その要素を参照することでオブジェクト自体を変更できます (インプレース変更)。このオブジェクト型は可変オブジェクトと呼ばれ、辞書もそのようなデータ型です。
前述の数値や文字列と同様に、オブジェクト自体は変更できず、参照のポインタのみが変更可能であり、これを不変データ オブジェクト (不変オブジェクト) と呼びます。
前に学習したタプルは参照要素を呼び出すことができますが、値を割り当てることはできないため、オブジェクト自体を変更することはできず、不変オブジェクトともみなされます。
動的型の観点から関数パラメータの受け渡しを見てみる
関数のパラメータ受け渡しは基本的に参照です。例:
a = 1
f(a)
を印刷します
可変オブジェクトが渡された場合、関数パラメータを変更すると元のオブジェクトが変更される可能性があります。元のオブジェクトを指すすべての参照が影響を受けるため、プログラミング時にはこの問題に注意してください。例:
a = [1,2,3]
f(a)
を印刷します
動的型付けは、Python の中心的なメカニズムの 1 つです。アプリ内で徐々に慣れていきます。
概要
参照とオブジェクトの分離 オブジェクトはメモリにデータを格納するエンティティであり、参照はオブジェクトを指します。
可変オブジェクト、不変オブジェクト
関数値の受け渡し