【Python】変数宣言の使い方を徹底解説|基礎から応用まで

・Pythonにおける変数の基本的な使い方が知りたい
・変数名の付け方や使用時の注意点が知りたい

という方に向けた記事になります。

Pythonを学び始めた段階だと、変数の使い方が分からない、変数を参照したときに思った通りの値が出力されない…と詰まることがあります。

そこで本記事では、「Pythonにおける変数の実践的な使い方」について詳しく解説します。

ななみ

変数の基本的な使い方から応用的な使い方まで、サンプルコードを用いて解説していきます!

目次

Pythonの変数とは?

Pythonの変数は、プログラム内で値を扱うための一時領域です。値を変数に代入し(一時領域に保存しておき)、必要な時に取り出す、といった形で使用します。

また、Pythonは「動的型付け」であるため、型を宣言せずに変数へ値を代入できる特徴があります。

ななみ

JavaやC言語などの言語では、変数の型(どんな値を入れるのか)を事前に定義しておく必要があります。

ここでは、変数の基本的な書き方等について見ていきます。

変数とは?Pythonでは型の定義が不要

Pythonの変数とは、値を保持するための識別名を指し、プログラム内でデータを扱う際の基本要素です。

他言語では「int」や「string」などの型を明示して宣言する必要がありますが、Pythonでは型を記述せずに変数へ値を代入できます。

これは Python が「動的型付け」の言語として設計されているためで、値を代入した時点で型が自動的に決まる仕組みになっています。

Pythonの公式ドキュメント:3.1.オブジェクト、値、型

この仕組みにより、コードが簡潔になり、初学者でも扱いやすいです。しかし、型が自動で決まるため、異なる型同士を意図せず混在させるとエラーが生じることがあり、注意が必要です。

ななみ

変数に整数を代入した後、同じ変数に文字列を代入する、ということも可能ですが、エラーの原因になったりするので注意しましょう。

変数宣言と代入の書き方

Pythonの変数宣言の基本構文は「変数名 = 値」であり、「=」は代入演算子として機能します。

たとえば x = 10 と記述すると、整数オブジェクト 10 の参照が x に割り当てられます。

x = 10
print(x)

# 出力結果
# 10

同様に message = “Hello” と記述すれば、文字列オブジェクトへの参照を設定できます。

message = "Hello!"
print(message)

# 出力結果
# Hello!

また、変数は代入によって値が上書きされます。たとえば x = 10 の後に x = 20 と記述すると、x は 20 を参照するようになります。

x = 10
print(x)

x = 20
print(x)

# 出力結果
# 10
# 20

以上のように、変数宣言自体は簡単なのですが、型の指定をしないで良い分、どんな値を入れる変数なのか「変数名」をしっかり付ける必要があるとも言えます。

変数と定数の違い

Pythonには、他言語のような正式な「定数」を宣言する構文が存在しません。変数はすべて再代入が可能であり、名前の付け方で意図を示す設計思想になっています。

Pythonの慣習として「定数」として扱いたい値には大文字の名前を付ける方法が一般的です。

Pythonの公式ドキュメント:定数

たとえば「TAX = 0.1」 のように大文字で記述すれば、開発者同士で「これは変更しない値」と共有できます。

# 定数
TAX = 0.1
JANUARY = "1月"
ななみ

ただし言語仕様として再代入を禁止しているわけではないため、意図せず書き換えられる可能性はあります。

一方、Pythonの変数は柔軟で、任意の値や型を代入できます。この特性は開発を効率化しますが、値が変化する前提の設計であるため、定数を多用する場面では明示的に扱いを区別する必要があります。

チーム開発をする場合は特に、統一された命名ルールやコード規約を整えておくと、誤った再代入を防ぎやすくなるでしょう。

Pythonの変数名の付け方(命名規則)

Pythonでは、読みやすく理解しやすいコードを書くため、変数名の付け方に関する明確なスタイルガイドが設けられています。

ここでは、公式ガイドである PEP8 をもとに、変数名の付け方を解説していきます。

変数名の付け方|PEP8のルール

Pythonで変数名を付ける際は、公式スタイルガイドである PEP8 のルールに従うことが推奨されています。

PEP8 では、変数名は「スネークケース(snake_case)」を用いることが基本とされています。

スネークケースとは、複数単語をアンダースコアでつなげて記述する形式で、たとえば「user_name」や「total_price」のような書き方です。

この形式が推奨される理由として、可読性の向上とチーム開発における統一性が挙げられます。Pythonのコードは「読みやすさ」を重視して設計されており、一目で役割を理解できる変数名が求められます。

たたとえば x1 のような抽象的な名前よりも item_count のような意味のわかる名前を使うことで、処理の意図を正確に伝えられます。

x = 1
# ↓
item_count = 1

また、変数名には小文字を使用し、大文字は定数やクラス名に使うのが一般的です。

変数名は誰が見てもわかりやすいような付け方を意識しましょう。学習の段階ではまだイメージしにくいと思いますが、長期的な保守性を左右する重要な要素であるため、正しいルールに従うことが重要です。

変数名に使える・使えない文字列

Pythonの変数名には、使用可能な文字と使用できない文字が明確に定められています。

まず、使用できる文字は「アルファベット(a〜z、A〜Z)」「数字(0〜9)」「アンダースコア(_)」の3種類です。ただし、変数名の先頭に数字を置くことは許可されていません。

  • アルファベット(a〜z、A〜Z)
  • 数字(0〜9)※変数名の先頭はNG
  • アンダースコア(_)

Pythonの公式ドキュメント:2.3.名前(識別子とキーワード)

そのため name_1 や _value は有効ですが、1name はエラーとなります。

また、変数名にスペースやハイフンなどは使用できません。user-name や total price のような記述は文法上無効となり、SyntaxError が発生します。

  • 変数名の先頭に数字
  • スペース
  • ハイフン
  • 予約語

さらに、Python には予約語と呼ばれる「言語構文で使用される特別な単語」が存在し、これらを変数名として使用することも禁止されています。

例えば for、class、return などが該当し、これらを変数名にするとプログラムが正しく構文解析できなくなります。予約語の一覧は公式の keyword モジュールで確認できます。

初心者がやりがちな命名ミスと回避策

Pythonの学習初期には、変数名の付け方で陥りやすいミスがいくつかあります。代表的なものは以下の通りです。

  • 意味のない短すぎる名前を使う
  • 予約語と同じ名前を使ってしまう
  • 用途に合わない抽象的な名前を使う

たとえば a や data のような名前は用途が広すぎるため、コードが複雑になるほど意図が不明確になりやすく、可読性を損ないます。

また、list や str のような組み込み型と同名の変数を定義するミスも初心者に多く見られます。これらは Python が内部で使用する名前であり、変数名として上書きしてしまうと本来の機能が利用できなくなります。

命名ミスを防ぐために、以下の点を意識して変数名を付けるようにしましょう。

  • 名前から役割がわかること
  • PEP8に沿った構造であること
  • Pythonの組み込み名を避けること
ななみ

VSCode や PyCharm のようなエディタでは、予約語の使用や構文違反を自動的に警告してくれるので便利です!

Pythonの変数の応用的な使い方

Pythonでは、変数を効率よく扱うための便利な機能が多数用意されています。代表的なものが多重代入とアンパックで、a, b = 1, 2 のように複数の値を一度に割り当てることができます。

ここでは、多重代入とアンパック、Noneなどについて解説していきます。

複数の変数を同時に代入する(多重代入・アンパック)

Pythonでは、複数の変数に対して同時に値を割り当てる「多重代入」が可能です。

これは可読性の高いコードを実現する便利な機能であり、Pythonの特徴的な文法として広く利用されています。

基本的な構文は a, b = 1, 2 のように、左辺と右辺で同じ数の要素を並べる形になります。

# 多重代入
a, b = 1,2

# 1つずつ代入
a = 1
b = 2
ななみ

aには「1」、bには「2」が代入されます。そのため、1つずつ代入するやり方と結果は同じになります!

また、リストやタプルなどのシーケンスを分解して代入する「アンパック代入」も同様の仕組みで動作します。

たとえば numbers = [1, 2, 3] とした上で x, y, z = numbers と記述すれば、それぞれの要素が変数へ自動的に割り当てられます。

numbers = [1, 2, 3]
x, y, z = numbers
print(x, y, z)

# 出力結果
# 1 2 3

変数の初期化の方法(None)

Pythonで変数を初期化する際には、None を利用する方法が一般的です。

a = None
b = 1
ななみ

変数の初期化は「変数だけ宣言しておきたいけど、まだ何も代入する値は決まっていない」という場合に使用します。

NoneはPythonの「値が存在しないこと」を明示するためのオブジェクトで、公式ドキュメントでも「独自の型 NoneType を持つ特殊な値」と定義されています。

Pythonの公式ドキュメント::https://docs.python.org/3/library/constants.html#None

初期化にNoneを使用する利点として、後から値を設定する意図を明確に示せる点が挙げられます。

ななみ

初期化には「0」や「””」を使用することも可能ですが、これでは意味のある値なのか、後から値を設定するつもりなのかどうかが判断できません。

たとえば、関数の中で後続処理に応じて値を変更する可能性がある場合、result = None のように最初に明示しておくことで、コードを見た他者にも「まだ値が設定されていない状態」であることが伝わります。

また、Noneを利用すると条件分岐が書きやすくなります。たとえば if result is None: のようにすることで、初期化状態かどうかを判定できます。

一時変数なしで値を入れ替える方法(a, b = b, a)

Pythonでは、変数の値を入れ替える際に一時変数を使う必要がありません。

他の多くの言語では「temp = a; a = b; b = temp;」のように一時変数に入れて値を入れ替える必要がありますが、Pythonでは a, b = b, a と1行で記述できます。

a = 2
b = 1

# aとbの値を入れ替える
a, b = b, a
print(a, b)

# 出力結果
# 1 2 3

この構文はシーケンスアンパックの一形態で、右辺の値がタプルとして組み立てられ、左辺の変数に順番に割り当てられる仕組みです。そのため、一時的な変数を作る必要がなく、誤った代入によるバグも避けやすくなります。

また、この構文は読みやすさの点でも優れています。a, b = b, a のような書き方は、初心者にも意図が明確に伝わるため、コードレビュー時の理解も容易です。

Pythonの変数を扱う上で知っておくべき注意点

Pythonの変数は「オブジェクトへの参照」であるため、代入すると変数が指す参照先が書き換わる点を理解することが重要です。

また、Pythonのオブジェクトはミュータブル(変更可能)とイミュータブル(変更不可)に分類されます。リストは変更可能ですが、整数や文字列は変更できません。

ここでは、こういったPythonを使う上での注意点について解説します。意識して使うことで、エラーやバグを減らせると思いますので、しっかり理解していきましょう。

代入で変数が「上書き」される仕組み

Pythonでは、変数は「オブジェクトへの参照」を保持する仕組みで動作します。

代入では値そのものを変数へ格納するのではなく、オブジェクトへの参照先が書き換わります。

たとえば x = 10 と記述すると、変数 x は整数オブジェクト 10 を指します。続けて x = 20 と代入すると、新たに作られた整数オブジェクト 20 へ参照先が変更されます。

x = 10
print(x)

x = 20
print(x)

# 出力結果
# 10
# 20
ななみ

値を保持しているというイメージの方が分かりやすいのですが、実際には「オブジェクトのへの参照先」が保持されています。

さらに、同じ変数名で別の型の値を代入することも可能です。たとえば x = 10 の後に x = “hello” とすると、x は文字列型のオブジェクトを参照するようになります。

x = 10
print(x)

x = "hello"
print(x)

# 出力結果
# 10
# hello

型が頻繁に切り替わると可読性が低下し、意図しないエラーを引き起こす可能性があるため、このような使い方は推奨されません。

ミュータブル・イミュータブルの違い

Pythonでは、オブジェクトが「変更可能かどうか」によってミュータブル(mutable)とイミュータブル(immutable)に分類されます。

  • ミュータブル(変更可能):整数・文字列・タプル
  • イミュータブル(変更不可):リスト

イミュータブルの例として、整数・文字列・タプルなどが挙げられ、これらは値の変更ができません。たとえば x = 10 のあとに x = x + 1 と記述すると、新しい整数オブジェクト 11 が作成され、x がその参照を持つようになります。

一方、ミュータブルなリストの場合、a = [1, 2] とした上で a.append(3) を実行すると、a = [1, 2, 3]となり同じオブジェクトの内容が変更されます。

この違いは、複数の変数が同じオブジェクトを参照している場合に特に重要です。

たとえばリスト「x = [1,2,3]」を作成し、「y = x」とすると、「y = [1,2,3]」になります。この状態で x.append(5) を実行すると、xもyも [1, 2, 3, 5] となります。

x = [1,2,3]
y = x
x.append(5)
print(x)
print(y)

# 出力結果
# [1, 2, 3, 5]
# [1, 2, 3, 5]

変数の参照範囲(スコープ)の理解

変数には「参照できる範囲」が存在し、これをスコープと呼びます。

Pythonのスコープは LEGB ルール(Local、Enclosing、Global、Built-in)に従って検索される仕組みで、基本的には「グローバルスコープ」と「ローカルスコープ」の違いが理解できればOKです。

最も狭いのは関数内で定義されたローカルスコープで、ここで作られた変数は関数の外から参照できません。また、関数が入れ子になっている場合は、外側の関数のスコープ(Enclosing)が参照されます。

モジュール全体の変数はグローバルスコープに属し、モジュール内のどこからでも利用可能です。サンプルコードで確認しましょう。

global_variable = "グローバル変数"
def get_variable():
    local_variable = "ローカル変数"
#    print(global_variable)  →参照OK。
    return local_variable
print(get_variable())
print(global_variable)
#print(local_variable)  →エラーになります。

# 出力結果
# ローカル変数
# グローバル変数

グローバル変数の「global_variable」は関数の中でも参照・使用できますが、ローカル変数の「local_variable」は関数の中でしか参照・使用できないことが確認できます。

また、「global」を付けたら、関数内の変数を関数の外側で使用することもできます。

def get_variable():
    global lo_variable
    lo_variable = "ローカル変数"
    return lo_variable
print(get_variable())
print(lo_variable)
ななみ

といったように、例外はありますが基本的には関数内の変数は関数の中で参照・使用するという認識でいいかなと思います。

まとめ:Pythonの変数宣言は基本知識だけど重要

Pythonの変数は、プログラムを構成する最も基本的な要素であり、正しく理解することでコードの品質と可読性が大きく向上します。

Pythonは動的型付けの仕組みを採用しており、型を明示せずに変数へ値を代入できる特徴があります。

x = 10
y = 20
といったように、変数の宣言と代入を同時に行います。また、型の宣言も不要です。

また、変数名はPEP8に従うことで、読みやすく統一されたコードを記述できます。特にスネークケースや予約語の回避は、複数人で開発する際に重要な役割を果たします。

加えて、Pythonでは多重代入やアンパック、None を用いた初期化など、便利な機能が数多く用意されています。これらの機能を理解することで、短く効率的なコードを書くことができます。

a, b = 1,2
a = None

一方で、変数の参照モデルやミュータブル・イミュータブルの違い、スコープの仕組みを正しく理解していないと、意図しない挙動を招くことがあります。

特に複数の変数が同じオブジェクトを参照する際には、変更が他の変数へ伝播する点に注意が必要です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次