基本的なPythonのセマンティックス: 変数とオブジェクト
この節は、Python言語の基本的なセマンティクスを扱いはじめるでしょう。シンタックスが前の節で扱われたのに対して、言語のセマンティクスは命令文の意味を巻き込みます。シンタックスの我々の議論を使ったように、ここでは、次の節のコードを理解するための参考のより良い枠組みを与えるために、Pythonにおける重要な意味の構築のいくつかを取り扱います。
この節は、変数とオブジェクトのセマンティクスを扱うでしょう、それはあなたがPythonスクリプトでデータをためて、参照し、操作する主要な方法です。
Python変数はポインタです
Python変数の割り当ては等記号(=)の左に変数名を置くのと同じくらい簡単です。
# assign 4 to the variable x
x = 4
これは、まっすぐそのままのようかもしれないが、もしあなたがこの演算子の動作について悪い精神状態を持ってたら、Pythonの動作方法は困惑させるようになるかもしれあに。簡潔にここで入り込んでみましょう。
多くの言語では、変数はあなたがデータを入れるコンテナやバケットとして最高の考え方です。Cであれば例えば、あなたはこう書き、
// C code
int x = 4;
重要なことにxという名のメモリバケットを定義することになり、4という値をそれに入れることになります。対照的に、変数はコンテナとしてではなくポインタとして最高の考え方になります。つまり、Pythonでは、こう書くと、
x = 4
あなたは本質的にxという名のポインタを定義することになり、それは4という値を含むいくつかの他のバケットへのポインタになります。この成行に留意しましょう、なぜならPythonの変数が単に他のオブジェクトへのポインタで、変数を定義したり、いつも同じ型の情報を指す変数を要求することさえ必要ないのです。これは、人々がPythonが動的な型付けという感覚です、変数名は任意の型のオブジェクトを指すことができます。Pythonにおいては、このようにできます:
In [1]:
x = 1 # x is an integer
x = 'hello' # now x is a string
x = [1, 2, 3] # now x is a list
静的型付け言語のユーザがCで見つかるような定義で生じる型安全を間違えるかもしれない一方で、
int x = 4;
動的型付けは、Pythonをとても早くかけて、読みやすくさせる部分の一つです。
この変数がポインタであるという結果のアプローチは、あなたが気づく必要があるものです。もし同じ変更可能なオブジェクトを指す二つの変数名があるなら、変更になる一つが同じように他のを変えることになるでしょう。例えば、リストを作って修正しましょう:
In [2]:
x = [1, 2, 3]
y = x
xとyという二つの変数を作り、両方が同じオブジェクトを指しています。
このため、もし一方の名前を経由するリストを修正すると、他のリストが同じように変更されるのをみるでしょう:
In [3]:
print(y)
[1, 2, 3]
In [4]:
x.append(4)
# append 4 to the list pointed to by x
print(y)
# y's list is modified as well!
[1, 2, 3, 4]
このふるまいはもしバケットやコンテナデータのように間違って変数を考えているなら、困惑させるかもしれません。しかし、オブジェクトへのポインタのように正しく変数を考えているなら、このふるまいは意味を成します。
またもし xへ他の値を割り当てるために "=" を使うなら、これはyの値に影響しないでしょう、割り当ては単に変数がさすオブジェクトへの変化となります。
In [5]:
x = 'something else'
print(y)
# y is unchanged
[1, 2, 3, 4]
もう一度、これはもしあなたがxとyをポインタのように、そして 名前が指すものを変える操作としての "=" 演算子を考えるなら完全な意味となります、
あなたはこのポインタのアイデアがPythonにおける算術演算子を追うのに難しくさせるのではないかと考えるかもしれないですが、Pythonはこれが問題ではないように準備されています。されています。数値、文字列、その他単純な型は変更不能です、あなたはそれらの値を変えることができません、あたなは唯一変数が指す値を変えられます、そんなわけで、例えば以下のように操作することは完全に安全です:
In [6]:
x = 10
y = x
x += 5 # add 5 to x's value, and assign it to x
print("x =", x)
print("y =", y)
x = 15
y = 10
x += 5 を呼ぶと、xによってさされる10 オブジェクトの値は変わりません。むしろ変数xを 値 15 の新しいintegerオブジェクトを指すように変わります。この理由から、yの値は操作により影響されません。
すべてはオブジェクトです
Pythonはオブジェクト指向プログラミング言語で、Pythonにおいてはすべてはオブジェクトです。
これが意味することを新しく考えてみましょう。先に私たちがみた変数は単なるポインタでした、そしてそれらの変数名は型の情報に関連づいてなかったです。これはいくつかPythonが型に自由な言語という誤った言及を導くものです。しかし、この場合ではないのです。次を考えましょう。
In [7]:
x = 4
type(x)
Out[7]:
int
In [8]:
x = 'hello'
type(x)
Out[8]:
str
In [9]:
x = 3.14159
type(x)
Out[9]:
float
Pythonは型を持っています。しかしながら、型は変数名にリンクされず、オブジェクトそれ自体にリンクされているのです。
Pythonのようなオブジェクト指向プログラミング言語では、オブジェクトはメタデータや機能性に関連づけられたデータを含む実態です。Pythonではすべてのものはオブジェクトで、各々の実態が属性という名のいくつかのメタデータをもってて、メソッドという名の機能性に関連付けされてるということを意味します。これらの属性とメソッドは.シンタックスを経由してアクセスされます。
例えば、前に項目をリストに加えるappendメソッドを持つlistをみました、そしてそれはdot"."シンタックスでアクセスされます。
In [10]:
L = [1, 2, 3]
L.append(100)
print(L)
[1, 2, 3, 100]
属性とメソッドともつリストのように混合オブジェクトが期待されるかもしれない一方で、ときどきPythonでは単純な型でさえ属性とメソッドが付属されることは期待されないかもしれない。例えば、数値型は、もし複素数として見られる場合は、値の実数部と虚数部を返す、実数と虚数の属性を持ちます。:
In [11]:
x = 4.5
print(x.real, "+", x.imag, 'i')
4.5 + 0.0 i
括弧の最初と最後を使って呼び出す関数を除いて、メソッドは属性のようなものです、例えば、浮動小数点数は、値が整数かどうかをチェックする is_integerと呼ばれるメソッドを持ちます。
In [12]:
x = 4.5
x.is_integer()
Out[12]:
False
In [13]:
x = 4.0
x.is_integer()
Out[13]:
True
Pythonですべてのものはオブジェクトであるといいましたが、本当にすべてのものが一つのオブジェクトであることを意味しています、つまりオブジェクトの属性やメソッドでさえそれら自体がその型情報をもったオブジェクトです。
In [14]:
type(x.is_integer)
Out[14]:
builtin_function_or_method
すべてがオブジェクトであるというPythonの設計選択が、いくつかの便利な言語構成を与えていることがわかるでしょう。