【Python入門・応用】04.変数|わかった気になっていない?基本をしっかり理解しよう!(変数はデータを入れることができる箱のようなもの)

こんにちは。キノコードです。
この動画では、変数について説明します。
説明する内容は、こちらです。
・変数とは
・変数名のルール

まず、変数について説明します。
変数は、例えるなら、「箱」のことです。
変数があることで、文字や数字などのデータを変数に入れておくことができます。
また、変数を必要な時に取り出すことができます。
変数にデータを入れることを「代入」といい、取り出すことを「参照」といいます。
変数には名前をつけることができ、「変数名」といいます。
変数を作ることを「変数を宣言する」といいます。
初めて変数にデータを入れることを「変数の初期化」といいます。
Pythonのコードを書いて見ていきましょう。

num = 1
print(num)

このコードは、変数numに整数の1を代入して、その変数の中身を表示させるプログラムです。
ここで、変数numに1という整数を代入しています。
変数へ代入するときは、イコールを1つだけ使います。
これで変数に1を代入することができます。
変数に1が代入されているか、変数を表示させてみましょう。
前のレッスンでも使いましたが、文字列や変数の中を参照するには、print関数を使います。
前のレッスンではダブルクォーテーションで文字列を囲いましたが、今回は変数の中を表示したいので、変数をそのまま記述します。
実行してみましょう。
「1」という整数が表示されました。
numに「1」が代入されていることがわかります。

変数名のルール

PythonにはPEP8という規約が定められており、その中で変数のつけ方にいくつかの決まりがあります。

まず、変数名はアルファベット、数字、アンダースコアを組み合わせて作ります。
スペース、ドット、カンマのような記号は変数名としては利用できません。
単語を区切りたいときは「kinoCode」のように大文字を使うか、「kino_code」のようにアンダースコアを使います。
前者はらくだのコブのように見えるので「キャメルケース」、後者はへびのように見えるので「スネークケース」と呼びます。

次に、変数名の最初の一文字目を数字にすることはできません。
数字そのものと区別がつきにくいためです。
最初の一文字目はアルファベットかアンダースコアで始めましょう。
また、アルファベットの大文字と小文字は区別されます。
予約語は変数名として使うことはできません。
予約語とは、「return」「class」「for 」「while」など、プログラミング言語ですでに役割が決まっている単語のことを言います。

順番にコードを書いて確認してみましょう。

アルファベットと数字、_の組み合わせ

num = 1
num01 = 2
num_01 = 3

print(num)
print(num01)
print(num_01)

numのあとに01の数字をつける変数を作ってみます。
この変数には2を代入します。
numのあとにアンダースコア、そのあとに01の数字をつけてみましょう。
この変数には3を代入します。
それぞれの変数を表示させてみましょう。
エラーにならずに、「1、2、3」が表示されました。

変数名は、数字から始めることができません。
また、アンダースコア以外に記号を使うことができません。
コードを書いて試してみましょう。

先頭に数字、_以外の記号は使用できない

num = 1
num01 = 2
num_01 = 3
num$01 = 4
num-01 = 5
01num = 6

print(num)
print(num01)
print(num_01)
print(num$01)    
print(num-01)
print(01num)

numの後にドルマークをつけてみましょう。
また、numの後にハイフンをつけてみましょう。
最後に、変数名の前に数字をつけてみましょう。
変数名が赤い文字になっています。エラーです。
念の為、実行をしてみます。
エラーになりました。

コメントアウト

num = 1
num01 = 2
num_01 = 3
# num$01 = 4
# num-01 = 5
# 01num = 6

print(num)
print(num01)
print(num_01)
# print(num$01)    
# print(num-01)
# print(01num)

こちらについてはエラーになるので、コメントアウトしておきましょう。
コメントアウトとは、記述したプログラムを処理させないようにすることです。
コメントアウトはシャープを記述することでできます。
また、ショートカットを使用できます。
macの場合は「command] + /(スラッシュ)」、Windowsの場合は「Ctrl + /」です。
この状態で実行してみます。
エラーの部分はコメントアウトしたため、エラーにならず実行されました。

大文字と小文字は区別される

NUM = 1
Num = 2

print(NUM)
print(Num)

大文字と小文字は区別されます。
すべて大文字のNUM、最初だけ大文字のNumを作って、変数に整数を代入させてみましょう。
それぞれ1と2を代入してみます。
もし仮に、大文字と小文字が区別されないのであれば、両方ともに2と表示されるはずです。
実行してみましょう。
別々の数字が表示されました。

予約語は使用できない

return = 10

print(return)

予約語は変数名にすることができません。
「return」という変数を作ってみましょう。
赤い波線が表示されています。
エラーです。

Pythonなどのプログラミング言語はたいてい予約語を持っています。
予約語とは、実際にプログラムで使用する基本的な命令のことです。
初めからPythonに搭載されている関数などが対象で、全部で35種類存在します。
Pythonの予約語は、他のプログラミング言語の予約語に比べると数がとても少ないです。
そのため、プログラムを書く時のルールがとてもシンプルであり、少ないルールを覚えるだけで様々なプログラムを作ることができるようになっています。
Pythonの予約語は、keywordモジュールのkeyword.kwlistを使うと確認できます。

import keyword

print(keyword.kwlist)
print(len(keyword.kwlist))

実行します。

予約語の一覧と予約語数の35が表示されました。
これらの予約語を変数名として利用しようとするとエラーになります。
また、変数名として利用したい文字列が予約語であるかどうかを調べることができます。
keyword.iskeyword()で丸括弧内に調べたい文字列を入力します。

import keyword

print(keyword.iskeyword('return'))
print(keyword.iskeyword('Return'))

予約語であればTrue、予約語でなければFalseが表示されます。

実行します。
returnは予約語、Returnは予約語ではないとなります。
そのため、先ほどコードで確認した通り'return'と'Return'は区別され、予約語ではない'Return'は変数名として使うことができるのです。

変数の参照

変数は例えるなら「箱」のこと、とお伝えしました。
厳密にいうと、値をいれておく箱の場所を指し示すものといえます。
基本的に数値や文字列などの値は一度「箱」に保管されると別の値に置き換えることはできません。
例えば、aという変数に10という数値を代入します。
そのあと、同じaという変数に20という数値を代入したとします。
すると、aという変数の箱に保管されていた10という値が20に入れ替わったように見えます。
しかし、そうではなく、全く別の箱に新しい20という値を保管し、その場所をaという変数が指し示すようになるのです。
コードを書いて見てみましょう。
変数aに10を代入、変数bにaを代入します。
そして変数aに20を代入します。
実行します。

a = 10
b = a
a = 20

print(a)
print(b)

aに20を代入した時点で、aは20という値が入った箱の場所を指し示すようになります。
しかし、bに関してはもとの箱の場所を指し示したままなので、10と表示されました。

変数の箱の場所は、id関数を使用することで確認できます。
文字列や数値、変数などの全てのオブジェクトには、固有のIDが振り分けられます。
id関数でそれぞれの変数のIDを確認してみましょう。
先ほどと同様に、変数aに10を代入し、このIDを表示します。
続けて変数bに変数aを代入し、変数aに20を代入します。
変数bと変数aのIDをそれぞれ表示してみます。
実行します。

a = 10
print(id(a))
b = a
a = 20
print(id(b))
print(id(a))

変数aに10を代入したときのIDと、20を代入したときのIDが異なることがわかります。
また、変数bのIDは、変数aに10を代入したときのIDと同じです。
このように、変数aの中が変わったように見えますが、実際には変数aが指し示す場所が変わっていることが確認できました。

以下は関数に移動
Pythonの変数には「ローカル変数」と「グローバル変数」があります。
ローカル変数とは、決められた場所でのみ利用できる変数のことです。
Pythonでは関数の中で定義された変数は、その関数の中でしか利用することができないことから、このような変数のことをローカル変数と呼びます。
また、この変数が利用できる範囲のことをスコープと呼び、関数の中で定義したローカル変数はローカルスコープに属することになります。
対して、グローバル変数とはどの範囲からもアクセスできる変数のことです。
関数の外で定義された変数は、関数の中でも表示することができることから、このような変数をグローバル変数と呼びます。
グローバル変数が定義されているスコープをグローバルスコープと呼び、ローカルスコープも包含されています。
では、関数の中で定義したローカル変数を、関数の外で使おうとするとエラーになるということを確認してみましょう。
関数を定義するにはdef文を使います。
defの後に関数名を置き、丸括弧内に引数を入れ、右端にコロンを置きます。

def local(num):
 a = 1
 print(a, num)

local(100)

print(a)

実行します。

エラーが表示されました。
なお、関数の中と外で同じ名前の変数を使う場合には注意が必要です。
変数名が同じでも、関数の中で代入が行われていると別のローカル変数として扱われます。
コードを書いて確認してみましょう。
関数の中でローカル変数に数値を代入し、関数の外で関数の中と同じ名前のグローバル変数を定義します。

def local():
 a = 1
 print(a)

a = 10

local()

print(a)

実行します。

このように同じaという変数名でも、関数内で定義したローカル変数と、関数外で定義したグローバル変数は別のものとして扱われ、1と10が表示されます。
関数内で定義されたローカル変数をグローバル変数であると宣言することができます。
これをグローバル宣言と呼び、globalの後に変数名を置くことで宣言できます。
グローバル宣言によって、グローバル変数の値を関数内でも変更することができるようになります。
先ほどのコードでグローバル宣言をし、結果を見てみましょう。

def local():
 global a
 a = 1
 print(a)

a = 10

local()

print(a)

実行します。

ローカル変数がグローバル変数として扱われるようになり、1と1が表示されます。
関数内に複数の関数がある場合、nonlocalを使うとすぐ外側の関数に影響を与えることができます。
まず関数内に関数を持つコードを書いてみます。

a = 0
def local():
 a = 1

 def local1():
  a = 2
  print(a)

 local1()

 print(a)

local()

print(a)

実行します。2,1,0が表示されました。

次に、local1()関数内で変数aに対してnonlocalを宣言します。
すると、local()関数内の変数aに影響を及ぼすようになります。

a=0

def local():
 a = 1

 def local1():
  nonlocal a
  a = 2
  print(a)

 local1()

 print(a)

local()

print(a)

実行します。 2,2,0が表示されました。

nonlocal宣言をすることで、local1()関数の外にある変数aをlocal1()関数内で更新することができています。
リストや辞書のような書き換え可能なオブジェクトを引数として使用する場合は注意が必要です。
リストや辞書を引数として渡した後に、引数を受け取る変数に対して処理を行うと、元のオブジェクトが書き換わってしまいます。
コードを書いて見てみましょう。

def local(l_list):
 l_list.append(10)

a = [1, 2, 3]

local(a)

print(a)

実行します。 [1, 2, 3, 10]が表示されました。

なお、globals()を使うとグローバル名前空間にあるシンボル一覧を、locals()を使うとローカル名前空間にあるシンボル一覧を見ることができます。
名前空間とはオブジェクトが所属する場所のことです。
オブジェクトがコードの中のどのような位置で最初に定義されたかによって、所属する名前空間が決まります。
コードを書いて見てみましょう。

def local():
 a = 1
 print(globals())
 print(locals())

b = 10
local()

実行します。

globals()ではグローバル空間にある変数bや関数local、さらにPythonが自動的に割り当てる変数が表示されました。
また、locals()ではローカル空間にある変数aが表示されました。
これまで変数についてお話してきましたが、似たようなものに定数があります。
定数とはその名の通り固定されたデータのことで、初めから値が決まっており、プログラムの処理内で書き換えが行われないデータのことです。
例えば、消費税率などは価格を算出するプログラム内で書き換えが行われてしまうと困るので、定数を使って処理をします。
しかし、実はPythonには定数というものが存在しません。
変数の書き換え自体を禁止する仕組みがないのです。
では、どうやって定数を扱うのかというと、一般的には変数名を大文字のアルファベットで表記します。
このルールを守らなくてもプログラムが作動しないということはないですが、定数と変数を区別しやすくするための暗黙の了解として覚えておいてください。