この記事では、Pythonの変数について解説していきます。
Pythonの変数は、プログラム中の値を参照するための識別子です。
変数には、オブジェクトのメモリ上の位置が含まれています。
Pythonでは、他のオブジェクトにアクセスし、そのオブジェクトの関数を呼び出したり、他の操作を実行することができます。
この記事もチェック:Pythonのexec関数の使い方|引数や変数の使い方を解説する
Pythonの変数を使う上でのルール
Pythonで変数を使う際には、以下の様なルールがあります。
- Pythonの変数名には小文字(a-z)、大文字(A-Z)、数字(0-9)、アンダースコア( _)を使用することができます。
- 変数名は数字で始めることはできません。
- 予約語(ifとかwhileとか)は変数名として使用できません。
- Pythonの変数名はアンダースコアや文字で始めることができます。
- 変数名は大文字と小文字を区別します。
- 変数名の長さに制限はないです。
Pythonで使える変数の例
以下は、Pythonで使える変数の例です。
- abc
- _
- __
- xxx_yAB
- ()
Pythonで使えない変数の例
逆に、Pythonで使えない変数の例です。
- 9abc : 変数名が数字で始まることはできません。
- 123 : 変数名には数字のみを含めることはできません。
- x-y : 変数名で使用できる特殊文字はアンダースコアのみです。
-
default : 予約キーワードのため、無効な変数名です。
Pythonで変数を定義する方法
Pythonは動的型付け言語なので、変数を宣言するときに型を指定する必要はありません。
Pythonの変数は等号で定義され、左側に変数名、右側に値をいれます。
Pythonで変数を宣言するいくつかの例を見てみましょう。
x = 1 # 数字
s = "Hello" # 文字列
t = (1 , 2)# タプル
l = [ 1 , 2 , 3 ] # リスト
d = {"1": "A","2": "B"} # 辞書
Pythonは、複数の変数に同時に値を入れられる多重代入もサポートしています。
多重代入を使えば、一度に複数の変数を定義することができます。
a = b = c = 100
print(a, b, c) # 100 100 100
また、変数のリストにシーケンスを代入することもできます。
この場合、シーケンスの要素数は変数の数と同じでなければなりません。
a, b, c = 1 , 2 , "Hello"
print(a, b, c) # 1 2 Hello
a, b, c = (1 , 2 , 3)
print(a, b, c) # 1 2 3
a, b, c = [ 1 , 2 , 3 ]
print(a, b, c) # 1 2 3
a, b, c = "098"
print(a, b, c) # 0 9 8
上記のコードで、特に最後の文字列を1文字ずつ分解して代入できるのは面白いですね。
ちなみに、変数の数と配列の要素数が等しくない場合、ValueError
が発生します。
>>> a,b = (1 , 2 , 3)
Traceback (most recent call last):
File"" , line 1 , in
ValueError: too many values to unpack (expected2)
>>>
>>> a,b,c,d =(1 , 2 , 3)
Traceback (most recent call last):
File"" , line 1 , in
ValueError:notenough values to unpack (expected4 , got 3)
>>>
Pythonで変数の値を表示、出力する方法
Pythonのprint()
関数を使えば、変数の値を表示することができます。
それでは、Pythonで変数の値を表示する例をいくつか見てみましょう。
x = 1
print(x)
s ="Hello"
print("s value is", s)
t =(1 , 2)
print("tuple value is", t)
l = [1 , 2 , 3]
print(l)
d = {"1": "A","2": "B"}
print("dict value is", d)
結果は以下の通りです。
1
s value is Hello
tuple value is (1, 2)
[1, 2, 3]
dict value is {'1': 'A', '2': 'B'}
Pythonの変数名に関するベストプラクティス
上記のコードスニペットを見ると、変数名がランダムになっています。
これでは、変数の意味が伝わりません。
Pythonで変数名をつけるときに従うべきベストプラクティスがいくつかあります。
- Pythonの変数名には小文字のアルファベット、数字、アンダースコアのみを使用します。
- 変数名に複数の単語がある場合、アンダースコアで区切ります。
- 変数スコープが private の場合、変数名の最初にアンダースコアを使用することができます。
- アンダースコアで始まる変数名やアンダースコアで終わる変数名は避けるべき。これらはPythonの組み込みプログラムで慣習的に使われています。
- 変数名には、
a
とかx
の様な変数名ではなく、常に意味のある名前を使用すること。
上記のベストプラクティスに基づき、上記のコードスニペットを変更して、適切な変数名を付けることができます。
count = 1
str_message = "Hello"
tuple_ints = (1 , 2)
list_of_numbers = [ 1 , 2 , 3 ]
numbers_letters_dict = {"1":"A","2":"B"}
type関数を使って変数の型を調べる方法
Pythonでは、type()
関数を使って変数の型を調べることができます。
それでは、変数の型を表示する例をいくつか見てみましょう。
count = 1 #
print(type(count))
str_message = "Hello"
print(type(str_message))
tuple_ints = (1 , 2)
print(type(tuple_ints))
list_of_numbers = [1 , 2 , 3]
print(type(list_of_numbers))
numbers_letters_dict = {"1": "A","2": "B"}
print(type(numbers_letters_dict))
結果は以下の様になります。
Pythonの変数のスコープ
変数のスコープは、プログラム内で変数がアクセス可能な範囲を定義します。
Pythonの変数には2つのスコープがあります。
- ローカルスコープ
- グローバルスコープ
以下は、詳しく見ていきます。
Pythonのローカル変数
関数やクラスの内部で変数が定義されると、その内部でのみアクセス可能になります。
これはローカル変数と呼ばれ、そのスコープはその関数やクラスの境界だけに限定されます。
もし、そのスコープ外のローカル変数にアクセスしようとすると、その変数が定義されていないという NameError
が発生します。
Python のローカル変数の考え方をいくつかの例で理解しましょう。
def foo():
foo_var = 1
print(foo_var)
実際に、上記のコードではprint(foo_var)
でローカル変数のfoo_var
にアクセスできないので、下記の様なエラーが発生してしまいます。
Traceback (most recent call last):
File "Main.py", line 5, in
print(foo_var)
NameError: name 'foo_var' is not defined
逆に、以下の様に直してあげると、上手く動きます。
def foo():
foo_var = 1
print(foo_var)
foo()
今度は、クラスにおけるスコープの例です。
class Foo:
class_foo_var = 1
print(class_foo_var)
上記のコードでは、下記のエラーが発生しまいます。
NameError: name 'class_foo_var' is not defined
今度は以下の様にコードを直します。
class Foo:
class_foo_var = 1
print(class_foo_var)
Foo()
今度は、1
と表示されるはずです。
Pythonのグローバル変数
変数が関数やクラスの内部にない場合、プログラム内のどこからでもアクセスできます。
このような変数をグローバル変数と呼びます。
以下は、Pythonのグローバル変数の例を見てみましょう。
global_msg = "Hello"
def foo():
print(global_msg)
class Foo:
print(global_msg)
foo()
Foo()
上記のコードは以下の様に表示されるはずです。
Hello
Hello
if-else、forループ、whileループ、try-exceptなどのブロック内でも、グローバル変数を定義することができます。
簡単な例で理解しましょう。
if True:
var_if ="if"
else:
var_else ="else"
print(var_if)
結果は以下の通りです。
elseブロックの中のコードが実行されなかったので、var_elseは定義されず、var_ifの変数が定義されていますね。
if
次に、try-exceptブロックを使った別の例を見てみましょう。
try:
var_try ="try"
except:
var_except ="except"
print(var_try)
tryブロックの中だけ実行されたので、var_try
変数がグローバル変数として評価されている事が分かります。
Pythonでの変数の削除方法
del
文を使用すると、変数を削除することができます。
ここでは、Pythonの変数を削除する簡単な例を見てみましょう。
count = 100
del count
print(count)
結果は以下の通りです。
del
で変数を削除したので、NameError
のエラーが発生しています。
Traceback (most recent call last):
File "Main.py", line 3, in
print(count)
NameError: name 'count' is not defined
Pythonのクラスにおける静的変数(static variable)
クラス内で定義された変数は、クラス名でアクセスすることができます。
クラスに属するため、静的変数とも呼ばれます。
class Data:
id = 12
print(Data.id) # 12と表示
これらの変数は、クラスオブジェクトからもアクセスすることができます。
しかし、Pythonでは静的変数にアクセスする時には、クラスを使って静的にアクセスすることが推奨されます。
d1 = Data()
# これでも間違いではないが、先ほどの使い方の方が好ましい
print(d1.id)
Pythonにおけるglobals()関数とlocals()関数について
Pythonには、globals
関数とlocals
関数と言う組み込み関数があり、これらの関数をで使用することで、ある変数がその場所でアクセス可能かどうかを確認することができます。
globals
関数とlocals
関数には、名前の通り以下の様な違いがあります。
- globals()関数は、現在のスコープのグローバル変数の辞書を返します。
- locals()関数は、現在のスコープのローカル変数の辞書を返します。
では、これらの関数の簡単な例を見てみましょう。
global_var = "global"
def foo():
local_var = "local"
print('global variables inside foo(): ', globals())
print('local variables inside foo(): ', locals())
print('global variables: ', globals())
print('local variables: ', locals())
foo()
結果は以下の通りです。
正直、出力がごちゃごちゃして分かりずらいですが、Pythonで定義されているあらゆるグローバル変数とローカル変数が呼び出されているのが分かります。
global variables: {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': , '__spec__': None, '__annotations__': {}, '__builtins__': , '__file__': 'Main.py', '__cached__': None, 'global_var': 'global', 'foo': }
local variables: {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': , '__spec__': None, '__annotations__': {}, '__builtins__': , '__file__': 'Main.py', '__cached__': None, 'global_var': 'global', 'foo': }
global variables inside foo(): {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': , '__spec__': None, '__annotations__': {}, '__builtins__': , '__file__': 'Main.py', '__cached__': None, 'global_var': 'global', 'foo': }
local variables inside foo(): {'local_var': 'local'}
この記事もチェック:Pythonでの変数の定義、出力、削除等を分かりやすく解説する
globalキーワードを使って明示的にグローバル変数にアクセスする
Pythonでは、関数内部でグローバル変数にアクセスすることができます。
しかし、関数内部からグローバル変数を変更することはできません。
関数内部でグローバル変数の値を変更するには、global
キーワードを使用しなければなりません。
この挙動を簡単な例で理解してみましょう。
name = "Python"
def foo():
name = "Java"
foo()
print(name)
上記のコードでは、foo
関数内でnameのグローバル変数を変更することを意図していますが、Python
と出力されてしまいます。
この理由には、代入演算子を使って nameの値を変更すると、グローバル変数ではなくローカル変数として扱われ始めるからです。
なので、グローバル変数の値を変更するには、globalキーワードを使用して、「グローバル変数のnameを使いますよ」とPythonに教える必要があります。
name = "Python"
def foo():
global name
name = "Java"
foo()
print(name)
これで上手くJava
と表示されました。