pythonのダイナミックタイプの概要

5939 ワード

この記事では、pythonのダイナミックタイプについて簡単に説明します.pythonの開発に入るには欠かせません.まず、動的タイプの言語でしか書けないコードをいくつか見てみましょう.
>>> a = 3
>>> a = 'hello,python'
>>> a = [1,2,3,4,5]

私は前後してaに数字のタイプ、文字列のタイプとリストのタイプを割り当てました.では、問題が来ました.aはいったいどんなタイプですか.
aは最後にリストタイプに割り当てられ、最終的にはリストタイプであるべきだと考える人もいるかもしれません.正しい答えは:aにはタイプがありません.
変数、オブジェクト、参照a = 3を例にとると、pythonは3の値を持つ整数タイプのオブジェクトを作成し、aによってそれを指す.aは変数(variable)、3はオブジェクト(object)、変数aはオブジェクト3の参照(reference)であり、簡単に言えば、変数はポインタであり、オブジェクトを指す.
タイプは変数ではなくオブジェクトに属します
pythonでは、変数にはタイプがありませんが、オブジェクトにはタイプがあり、タイプはオブジェクトにのみ存在します.pythonの変数は、特定のタイプのオブジェクトを特定の時間に参照することです.
pythonオブジェクトには、タイプ識別子(特定のタイプのオブジェクトを指すポインタ)と参照カウンタの2つのヘッダ情報があります.前者はオブジェクトのタイプを識別し、後者はオブジェクトが回収されるタイミングを決定します.
対象のゴミ収集
>>> a = 3
>>> a = 'hello,python'
>>> a = [1,2,3,4,5]

上のコードは3つのオブジェクトを連続して作成し、オブジェクトaは最後のリストオブジェクトを指し、前の2つのオブジェクトは変数がないため自動的に回収されます.このプロセスは自動的で、プログラマがコードを書く必要はありません.
リファレンスカウンタといえば、ループリファレンスなどの特殊な状況を思い浮かべる人もいるに違いありませんが、pythonもこれらの問題を考慮してよく処理されていると信じています.
共有参照の問題
>>> a=2
>>> b=a
>>> a+=2
>>> a
4
>>> b
2

上記のコードでは、aとbは同時にオブジェクト2を指し、a += 2によってオブジェクトaを修正するが、最終的な結果はa=4、b=2である.私が最初に思った最終結果はaとbが4に等しいことだった.数値タイプは可変であるため、a += 2はaを新しいオブジェクトに向け、この新しいオブジェクトの値は4であり、bは元のオブジェクト2を指す.
次のコードを見てみましょう
>>> a = [1,2,3,4,5]
>>> b = a
>>> a.append(6)
>>> b
[1, 2, 3, 4, 5, 6]

aとbは同時に1つのリストを指し、a.append(6)によってリストを修正すると、bも変化する.これは私たちが期待していた結果です.リストタイプは可変であるため、append()は新しいリストを作成する必要はありません.
pythonのコアデータ型では、数値、文字列、メタグループは可変であり、リスト、辞書、セット(set)は可変である.
オブジェクトの等しい問題
pythonでは、2つのオペレータが常に2つのオブジェクトが等しいかどうかを比較するために使用されます:-==オペレータ、2つのオブジェクトの値が等しいかどうかを比較します-isオペレータ、2つのオブジェクトが同じオブジェクトであるかどうかを比較したり、比較ポインタが等しいかどうかを比較したりします.
>>> a = [1,2,3,4,5]
>>> b = a
>>> a == b
True
>>> a is b
True

上記のコードでは、変数aとbは同じオブジェクトを指すので、'==オペレータ'と'isオペレータ'の比較の結果は等しい.
>>> a = [1,2,3,4,5]
>>> b = a[:]
>>> a == b
True
>>> a is b
False

上記のコードでは、aとbはそれぞれ1つの値が等しいリストを指すので、'==オペレータ'の比較結果は等しく、'isオペレータ'の比較結果は等しくない.
>>> a = 3
>>> b = 3
>>> a == b
True
>>> a is b
True

上はどうしたんですか.これは、pythonが3というオブジェクトを作成するときに怠け者になったためで、pythonのキャッシュメカニズム(小さな整数と文字列がキャッシュされて多重化される)が有効になります.次のコードはpythonが小さい数字しかキャッシュできないことを証明しています.
>>> a = 1212313
>>> b = 1212313
>>> a == b
True
>>> a is b
False

他の言語との比較
  • 従来の静的タイプ言語と比較:従来の静的タイプ言語(CおよびクラスC言語)の変数はタイプがあり、pythonの変数はタイプがない
  • である.
  • javaやc#などの管理言語と比較:pythonには値タイプや参照タイプの概念がなく、可変タイプと非可変タイプの
  • しかありません.
  • javascriptと比較:javascriptオブジェクトは、実行時に新しい属性と方法を付与することができ、よりダイナミックで、タイプの概念が全くないようです.pythonにはタイプがあり、特定のタイプは一連の特定の操作に対応しています.