Pythonの変数

Pythonの変数

Pythonの基本データ型の以前のチュートリアルでは、さまざまなPythonデータ型の値を作成する方法を見ました。 しかし、これまでのところ、表示されている値はすべてリテラル値または定数値です。

>>>

>>> print(5.3)
5.3

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

このチュートリアルで学習する内容は次のとおりです。 Pythonプログラムのすべてのデータ項目を抽象的な用語 object で記述する方法、および variablesというシンボリック名を使用してオブジェクトを操作する方法を学習します。

無料のPDFダウンロード: Python 3 Cheat Sheet

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

link:/quizzes/python-variables/[クイズに挑戦»]

変数の割り当て

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

>>>

>>> n = 300

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

>>>

>>> print(n)
300

`+ print()+`を必要とせずに、REPLセッションでインタプリタプロンプトからリテラル値を直接表示できるように、変数も可能です。

>>>

>>> n
300

後で、「+ n +」の値を変更して再び使用すると、代わりに新しい値が代わりに使用されます。

>>>

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

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

>>>

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

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

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は、非常にhttps://realpython.com/python3-object-oriented-programming/[オブジェクト指向言語]です。 実際、Pythonプログラムのほぼすべてのデータ項目は、特定のタイプまたはクラスのオブジェクトです。 (この点は、これらのチュートリアルの過程で何度も繰り返されます。)

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

>>>

>>> print(300)
300

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

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

  • 値に「300」を指定します

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

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

>>>

>>> type(300)
<class 'int'>

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

例えば:

>>>

>>> n = 300

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

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

>>>

>>> print(n)
300
>>> type(n)
<class 'int'>

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

>>>

>>> m = n

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

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

>>>

>>> m = 400

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

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

>>>

>>> n = "foo"

Pythonは値 `" foo "`で文字列オブジェクトを作成し、 `+ n +`がそれを参照するようにします。

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

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

オブジェクトへの参照の数がゼロになると、そのオブジェクトにはアクセスできなくなります。 その時点で、その寿命は終わりました。 Pythonは最終的にアクセスできないことに気付き、割り当てられたメモリを再利用して、他の何かに使用できるようにします。 コンピューター用語では、このプロセスはhttps://en.wikipedia.org/wiki/Garbage_collection_%28computer_science%29[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 」、「 m 」および「 n 」は両方とも同じオブジェクトを指し、「 id(m)」および「 id(n)」が同じ番号。 「 m 」が「+400」に再割り当てされると、「+ m 」と「 n +」は異なるアイデンティティを持つ異なるオブジェクトを指します。

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

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

ここで、「+ m 」と「 n 」は、値「+30」を持つ整数オブジェクトに個別に割り当てられます。 しかし、この場合、 `+ id(m)`と ` id(n)+`は同一です!

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

変数名

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

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

注意: Python 3に追加されたものの1つは、Unicodeを完全にサポートしたことです。 ユニコードについては、今後のチュートリアルでさらに詳しく学習します。

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

>>>

>>> 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

同じプログラムで、「+ age 」と「 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

それらはすべて、おそらく「+ n 」や「 ncg +」などよりも優れた選択肢です。 少なくとも、変数の値が何を表すのかを名前から知ることができます。

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

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

  • 例: + numberOfCollegeGraduates +

  • *パスカルケース:*キャメルケースと同じですが、最初の単語も大文字になります。

  • 例: + NumberOfCollegeGraduates +

  • *スネークケース:*単語はアンダースコアで区切られます。

  • 例: + number_of_college_graduates +

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

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

Pythonコードのスタイルガイド(別名 PEP 8 )には、https://www.python.org/dev/peps/が含まれています。 pep-0008/#naming-conventions [命名規則]には、さまざまなオブジェクトタイプの名前の推奨標準がリストされています。 PEP 8には次の推奨事項が含まれています。

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

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

予約語(キーワード)

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

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

Python + Keywords      

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")」と入力すると、いつでもこのリストを表示できます。 予約語は大文字と小文字が区別され、示されているとおりに使用する必要があります。 ` False `、 ` None `、および ` True +`を除き、すべて完全に小文字です。

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

>>>

>>> for = 3
SyntaxError: invalid syntax

結論

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

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

次に、データオブジェクトをさまざまな*操作*を含む*式*に結合する方法を説明します。

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

link:/quizzes/python-variables/[クイズに挑戦»]