Pythonの変数

Pythonの変数

Basic Data Types in Pythonに関する前のチュートリアルでは、さまざまなPythonデータ型の値を作成する方法を説明しました。 しかし、これまでのところ、表示されている値はすべてリテラル値または定数値です。

>>>

>>> print(5.3)
5.3

より複雑なコードを記述している場合、プログラムには、プログラムの実行が進むにつれて変化するデータが必要です。

Here’s what you’ll learn in this tutorial: Pythonプログラムのすべてのデータ項目を抽象用語objectで記述する方法と、variablesと呼ばれる記号名を使用してオブジェクトを操作する方法を学習します。

無料のPDFダウンロード: Python3チートシート

__ Take the Quiz:インタラクティブな「Python変数」クイズで知識をテストします。 完了すると、学習の進捗状況を経時的に追跡できるようにスコアを受け取ります。

変数の割り当て

変数は、特定のオブジェクトに付けられた名前と考えてください。 Pythonでは、他の多くのプログラミング言語の場合のように、変数を事前に宣言または定義する必要はありません。 変数を作成するには、値を割り当ててから使用を開始します。 割り当ては、単一の等号(=)で行われます。

>>>

>>> n = 300

これは、「nには値300が割り当てられている」と読み取られるか解釈されます。これが完了すると、nをステートメントまたは式で使用でき、その値が置き換えられます。

>>>

>>> print(n)
300

リテラル値がREPLセッションのインタープリタープロンプトからprint()を必要とせずに直接表示できるのと同様に、変数も次のようになります。

>>>

>>> n
300

後で、nの値を変更して再度使用すると、代わりに新しい値に置き換えられます。

>>>

>>> n = 1000
>>> print(n)
1000
>>> n
1000

Pythonでは、連鎖代入も可能です。これにより、同じ値を複数の変数に同時に割り当てることができます。

>>>

>>> a = b = c = 300
>>> print(a, b, c)
300 300 300

上記の連鎖割り当ては、300を変数ab、およびcに同時に割り当てます。

Pythonの変数タイプ

多くのプログラミング言語では、変数は静的に型付けされます。 つまり、変数は特定のデータ型を持つように最初に宣言され、その有効期間中に変数に割り当てられる値は常にその型を持つ必要があります。

Pythonの変数はこの制限を受けません。 Pythonでは、変数に1つの型の値を割り当ててから、後で別の型の値を再割り当てできます。

>>>

>>> var = 23.5
>>> print(var)
23.5

>>> var = "Now I'm a string"
>>> print(var)
Now I'm a string

オブジェクト参照

変数を割り当てたときに実際に何が起こっていますか? これはPythonでの重要な質問です。答えは他の多くのプログラミング言語で見られるものとは多少異なるためです。

Pythonは非常にobject-oriented languageです。 実際、Pythonプログラムのほぼすべてのデータ項目は、特定のタイプまたはクラスのオブジェクトです。 (この点は、これらのチュートリアルの過程で何度も繰り返されます。)

このコードを見てください:

>>>

>>> print(300)
300

ステートメントprint(300)が提示されると、インタプリタは次のことを行います。

  • 整数オブジェクトを作成します

  • 300を与えます

  • コンソールに表示します

組み込みのtype()関数を使用して整数オブジェクトが作成されていることがわかります。

>>>

>>> type(300)

Python変数は、オブジェクトへの参照またはポインターであるシンボリック名です。 オブジェクトが変数に割り当てられると、その名前でオブジェクトを参照できます。 ただし、データ自体はまだオブジェクト内に含まれています。

例えば:

>>>

>>> n = 300

この割り当てにより、値300の整数オブジェクトが作成され、そのオブジェクトを指すように変数nが割り当てられます。

次のコードは、nが整数オブジェクトを指していることを確認します。

>>>

>>> print(n)
300
>>> type(n)

ここで、次のステートメントを検討してください。

>>>

>>> m = n

実行されるとどうなりますか? Pythonは別のオブジェクトを作成しません。 nが指すのと同じオブジェクトを指す新しいシンボリック名または参照mを作成するだけです。

次に、これを行うと仮定します。

>>>

>>> m = 400

これで、Pythonは値400で新しい整数オブジェクトを作成し、mがそのオブジェクトへの参照になります。

最後に、次のステートメントが次に実行されると仮定します。

>>>

>>> n = "foo"

これで、Pythonは値"foo"の文字列オブジェクトを作成し、nにそれを参照させます。

整数オブジェクト300への参照はもうありません。 孤立しているため、アクセスする方法はありません。

このシリーズのチュートリアルでは、オブジェクトの存続期間について言及する場合があります。 オブジェクトの寿命は作成されたときに始まり、その時点で少なくとも1つの参照が作成されます。 オブジェクトの存続期間中に、上で見たようにオブジェクトへの追加の参照が作成される場合があります。また、オブジェクトへの参照も削除される場合があります。 オブジェクトへの参照が少なくとも1つある限り、オブジェクトは存在し続けます。

オブジェクトへの参照の数がゼロになると、そのオブジェクトにはアクセスできなくなります。 その時点で、その寿命は終わりました。 Pythonは最終的にアクセスできないことに気付き、割り当てられたメモリを再利用して、他の何かに使用できるようにします。 コンピューター用語では、このプロセスはgarbage collectionと呼ばれます。

オブジェクトのアイデンティティ

Pythonでは、作成されるすべてのオブジェクトには、それを一意に識別する番号が付けられます。 ライフタイムが重複する期間中、2つのオブジェクトが同じ識別子を持つことはありません。 上記の300オブジェクトで発生したように、オブジェクトの参照カウントがゼロになり、ガベージコレクションが行われると、その識別番号が使用可能になり、再び使用できるようになります。

組み込みのPython関数id()は、オブジェクトの整数識別子を返します。 id()関数を使用すると、2つの変数が実際に同じオブジェクトを指していることを確認できます。

>>>

>>> n = 300
>>> m = n
>>> id(n)
60127840
>>> id(m)
60127840

>>> m = 400
>>> id(m)
60127872

割り当てm = nの後、mnは両方とも同じオブジェクトを指し、id(m)id(n)が同じ番号を返すという事実によって確認されます。 m400に再割り当てされると、mnは異なるIDを持つ異なるオブジェクトを指します。

ディープダイブ:小さな整数値のキャッシュ

Pythonでの変数の割り当てとオブジェクト参照についての現在の知識から、次のことはおそらく驚くことではありません。

>>>

>>> m = 300
>>> n = 300
>>> id(m)
60062304
>>> id(n)
60062896

ステートメントm = 300を使用して、Pythonは値300の整数オブジェクトを作成し、それへの参照としてmを設定します。 次に、nは、値300の整数オブジェクトに同様に割り当てられますが、同じオブジェクトには割り当てられません。 したがって、それらは異なるIDを持ち、id()によって返される値から確認できます。

しかし、これを考えてください。

>>>

>>> m = 30
>>> n = 30
>>> id(m)
1405569120
>>> id(n)
1405569120

ここで、mnは、値30を持つ整数オブジェクトに個別に割り当てられます。 ただし、この場合、id(m)id(n)は同じです。

最適化の目的で、インタープリターは起動時に[-5, 256]の範囲の整数のオブジェクトを作成し、プログラムの実行中にそれらを再利用します。 したがって、この範囲の整数値に個別の変数を割り当てると、実際には同じオブジェクトを参照します。

変数名

これまで見てきた例では、mnなどの短く簡潔な変数名を使用しています。 ただし、変数名はより冗長な場合があります。 実際、それが変数の目的を一見してより明らかにするので、それらが通常有益です。

公式には、Pythonの変数名は任意の長さにすることができ、大文字と小文字(A-Za-z)、数字(0-9)、およびアンダースコア文字(_)で構成できます。 s)。 追加の制限として、変数名には数字を含めることができますが、変数名の最初の文字を数字にすることはできません。

Note: Python 3への追加の1つは、完全なUnicodeサポートでした。これにより、変数名にもUni​​code文字を使用できます。 ユニコードについては、今後のチュートリアルでさらに詳しく学習します。

たとえば、次のすべては有効な変数名です。

>>>

>>> name = "Bob"
>>> Age = 54
>>> has_W2 = True
>>> print(name, Age, has_W2)
Bob 54 True

しかし、変数名は数字で始めることができないため、これはそうではありません。

>>>

>>> 1099_filed = False
SyntaxError: invalid token

大文字と小文字が区別されることに注意してください。 小文字と大文字は同じではありません。 アンダースコア文字の使用も重要です。 以下のそれぞれが異なる変数を定義します。

>>>

>>> age = 1
>>> Age = 2
>>> aGe = 3
>>> AGE = 4
>>> a_g_e = 5
>>> _age = 6
>>> age_ = 7
>>> _AGE_ = 8

>>> print(age, Age, aGe, AGE, a_g_e, _age, age_, _AGE_)
1 2 3 4 5 6 7 8

同じプログラムでageAge、さらに言えばagEと呼ばれる2つの異なる変数を作成することを妨げるものは何もありません。 しかし、おそらく賢明ではありません。 しばらく離れると、コードを読み取ろうとしている人、さらには自分自身を混乱させる可能性があります。

変数に使用目的を明確にするのに十分な説明的な名前を付けることは価値があります。 たとえば、大学を卒業した人の数を集計しているとします。 おそらく次のいずれかを選択できます。

>>>

>>> numberofcollegegraduates = 2500
>>> NUMBEROFCOLLEGEGRADUATES = 2500
>>> numberOfCollegeGraduates = 2500
>>> NumberOfCollegeGraduates = 2500
>>> number_of_college_graduates = 2500

>>> print(numberofcollegegraduates, NUMBEROFCOLLEGEGRADUATES,
... numberOfCollegeGraduates, NumberOfCollegeGraduates,
... number_of_college_graduates)
2500 2500 2500 2500 2500

それらはすべて、nncgなどよりもおそらく良い選択です。 少なくとも、変数の値が何を表すのかを名前から知ることができます。

一方、必ずしもすべてが等しく読みやすいわけではありません。 多くのことと同様に、それは個人的な好みの問題ですが、ほとんどの人は、文字がすべて一緒に押し込まれている最初の2つの例を読むのが難しく、特にすべて大文字の場合を見つけるでしょう。 複数ワードの変数名を作成する最も一般的に使用される方法は、最後の3つの例です。

  • Camel Case: 2番目以降の単語は大文字で表記され、単語の境界が見やすくなっています。 (おそらく、変数名全体に大文字が散らばってラクダのこぶによく似ていると、ある時点で誰かを驚かせたでしょう。)

    • 例:numberOfCollegeGraduates

  • Pascal Case:最初の単語も大文字になっていることを除いて、キャメルケースと同じです。

    • 例:NumberOfCollegeGraduates

  • Snake Case:単語はアンダースコアで区切られます。

    • 例:number_of_college_graduates

プログラマーは意外な熱意を持って熱い議論をしていますが、どちらが望ましいかです。 それらすべてについて、適切な議論を行うことができます。 3つのうち、視覚的に最も魅力的なものを使用してください。 いずれかを選択して、一貫して使用します。

名前を指定できるのは変数だけではないことが後でわかります。 関数、クラス、モジュールなどに名前を付けることもできます。 変数名に適用される規則は、プログラムオブジェクトに与えられる名前のより一般的な用語である識別子にも適用されます。

PEP 8とも呼ばれるStyle Guide for Python Codeには、さまざまなオブジェクトタイプの名前の推奨標準を一覧表示するNaming Conventionsが含まれています。 PEP 8には次の推奨事項が含まれています。

  • 関数と変数名にはSnake Caseを使用する必要があります。

  • クラス名にはパスカルケースを使用する必要があります。 (PEP 8ではこれを「CapWords」規則と呼んでいます。)

予約語(キーワード)

識別子名にはもう1つの制限があります。 Python言語では、特別な言語機能を指定する小さなキーワードセットが予約されています。 オブジェクトには予約語と同じ名前を付けることはできません。

Python 3.6には、33個の予約キーワードがあります。

Python
キーワード
     

False

def

if

raise

None

del

import

return

True

elif

in

try

and

else

is

while

as

except

lambda

with

assert

finally

nonlocal

yield

break

for

not

class

from

or

continue

global

pass

このリストは、Pythonインタープリターにhelp("keywords")と入力することでいつでも表示できます。 予約語は大文字と小文字が区別され、示されているとおりに使用する必要があります。 FalseNone、およびTrueを除いて、これらはすべて完全に小文字です。

予約語と同じ名前の変数を作成しようとすると、エラーが発生します。

>>>

>>> for = 3
SyntaxError: invalid syntax

結論

このチュートリアルでは、オブジェクトの参照とID、Python識別子の命名など、Pythonvariablesの基本について説明しました。

これで、Pythonのデータ型のいくつかを十分に理解し、それらの型のオブジェクトを参照する変数を作成する方法を理解できました。

次に、さまざまなoperationsを含むexpressionsにデータオブジェクトを組み合わせる方法を説明します。

__ Take the Quiz:インタラクティブな「Python変数」クイズで知識をテストします。 完了すると、学習の進捗状況を経時的に追跡できるようにスコアを受け取ります。