ホームページ  >  記事  >  バックエンド開発  >  Python上級チュートリアルでの動的型の詳細な説明

Python上級チュートリアルでの動的型の詳細な説明

WBOY
WBOYオリジナル
2016-06-16 08:42:18911ブラウズ

動的型付けは、Python のもう 1 つの重要な中心概念です。前に述べたように、Python 変数は宣言する必要がなく、値を代入するときに変数を任意の値に再代入できます。これらはすべて動的型付けの概念に関連しています。

ダイナミック型

私たちが接触するオブジェクトの中には、データを保存するために使用される特別なタイプのオブジェクトがあります。このタイプの一般的なオブジェクトには、さまざまな数値、文字列、テーブル、辞書が含まれます。 C言語では、このようなデータ構造を変数と呼びます。 Python では、これらはオブジェクトです。

オブジェクトはメモリに保存されるエンティティです。ただし、オブジェクトに直接アクセスすることはできません。プログラムに記述するオブジェクト名は、このオブジェクトへの単なる参照です。

参照とオブジェクトの分離は動的型の中核です。参照はいつでも新しいオブジェクトを指すことができます:

コードをコピー コードは次のとおりです:

a = 3
a = 'で'

最初のステートメントでは、3 はメモリに格納されている整数オブジェクトです。代入を通じて、 a がオブジェクト 3 を指すように参照します。

2 番目のステートメントでは、文字列であるオブジェクト「at」がメモリ内に作成されます。 a は「at」を指します。この時点で、オブジェクト 3 はそれへの参照を失います。 Python は参照されていないオブジェクトを自動的に破棄 (破壊) し、対応するメモリを解放します。

(小さな整数や短い文字列の場合、Python はこれらのオブジェクトを頻繁に作成および破棄する代わりにキャッシュします。)

コードをコピー コードは次のとおりです:
a = 5
b = a
a = a + 2
この例をもう一度見てください。最初の 2 つの文を通して、a と b が同じ整数オブジェクト 5 を指すようにします (b = a は、参照 b が参照 a が指すオブジェクトを指すようにすることを意味します)。しかし、3 番目の文は実際には参照 a を再割り当てし、新しいオブジェクト 7 をポイントします。このとき、aとbはそれぞれ異なるオブジェクトを指します。複数の参照が同じオブジェクトを指している場合でも、参照の値が変更された場合、実際には新しい参照を指しており、他の参照の指向には影響を与えないことがわかります。効果の観点から見ると、各参照は独立しており、相互に影響を与えません。

他のデータ オブジェクトについても同様です:

コードをコピー コードは次のとおりです:

L1 = [1,2,3]
L2 = L1
L1 = 1

ただし、次の状況には注意してください

コードをコピー コードは次のとおりです:

L1 = [1,2,3]
L2 = L1
L1[0] = 10
L2 を印刷

この場合、値を参照 L1 に割り当てるのではなく、L1 が指すテーブルの要素に割り当てます。その結果、L2も同時に変化します。

その理由は何ですか? L1 と L2 のポイントは変更されていないため、依然としてそのテーブルをポイントしています。テーブルは実際には複数の参照を含むオブジェクトです (各参照は L1[0]、L1[1]... などの要素であり、各参照は 1、2、3 などのオブジェクトを指します)。 L1[0] = 10 の代入操作は L1 のポイントを変更しませんが、テーブル オブジェクト (要素) の一部である L1[0] に対して操作するため、そのオブジェクトを指すすべての参照がすべて影響を受けます。

(対照的に、以前の代入操作はオブジェクト自体には影響を与えず、参照点を変更しただけでした。)

リストは、その要素を参照することでオブジェクト自体を変更できます (インプレース変更)。このオブジェクト型は可変オブジェクトと呼ばれ、辞書もそのようなデータ型です。

前述の数値や文字列と同様に、オブジェクト自体は変更できず、参照のポインタのみが変更可能であり、これを不変データ オブジェクト (不変オブジェクト) と呼びます。

前に学習したタプルは参照要素を呼び出すことができますが、値を割り当てることはできないため、オブジェクト自体を変更することはできず、不変オブジェクトともみなされます。

動的型の観点から関数パラメータの受け渡しを見てみる

関数のパラメータ受け渡しは基本的に参照です。例:

コードをコピー コードは次のとおりです:

def f(x):
x = 100
xを印刷

a = 1
f(a)

を印刷します


パラメータ x は、a が指すオブジェクトを指す新しい参照です。パラメーターが不変オブジェクトの場合、a 参照と x 参照は互いに独立しています。パラメータ x に対する操作は参照 a には影響しません。このような転送は、C 言語の値の転送に似ています。

可変オブジェクトが渡された場合、関数パラメータを変更すると元のオブジェクトが変更される可能性があります。元のオブジェクトを指すすべての参照が影響を受けるため、プログラミング時にはこの問題に注意してください。例:

コードをコピー コードは次のとおりです:

def f(x):
x[0] = 100
xを印刷

a = [1,2,3]
f(a)

を印刷します

動的型付けは、Python の中心的なメカニズムの 1 つです。アプリ内で徐々に慣れていきます。

概要

参照とオブジェクトの分離 オブジェクトはメモリにデータを格納するエンティティであり、参照はオブジェクトを指します。

可変オブジェクト、不変オブジェクト

関数値の受け渡し

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。