Pythonでの変数の定義やスコープ、削除、globalキーワードを解説していく

スポンサーリンク

この記事では、Pythonの変数について解説していきます。

Pythonの変数は、プログラム中の値を参照するための識別子です。

変数には、オブジェクトのメモリ上の位置が含まれています。

Pythonでは、他のオブジェクトにアクセスし、そのオブジェクトの関数を呼び出したり、他の操作を実行することができます。

スポンサーリンク

Pythonの変数を使う上でのルール

Pythonで変数を使う際には、以下の様なルールがあります。

  1. Pythonの変数名には小文字(a-z)、大文字(A-Z)、数字(0-9)、アンダースコア( _)を使用することができます。
  2. 変数名は数字で始めることはできません。
  3. 予約語(ifとかwhileとか)は変数名として使用できません。
  4. Pythonの変数名はアンダースコアや文字で始めることができます。
  5. 変数名は大文字と小文字を区別します。
  6. 変数名の長さに制限はないです。

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で変数名をつけるときに従うべきベストプラクティスがいくつかあります。

  1. Pythonの変数名には小文字のアルファベット、数字、アンダースコアのみを使用します。
  2. 変数名に複数の単語がある場合、アンダースコアで区切ります。
  3. 変数スコープが private の場合、変数名の最初にアンダースコアを使用することができます。
  4. アンダースコアで始まる変数名やアンダースコアで終わる変数名は避けるべき。これらはPythonの組み込みプログラムで慣習的に使われています。
  5. 変数名には、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つのスコープがあります。

  1. ローカルスコープ
  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'}

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と表示されました。

タイトルとURLをコピーしました