Yamamoto's Laboratory
 
環境設定
 
プログラム作成
  書き方
 
 変数
 
 
 
tkinter
 
 
 
 
 
 

はじめに

Python の変数名と値(メモリーのデータ)の対応関係は,オブジェクト参照と呼ばれる方法が使われています.

変数の生成と消滅,スコープ

生成

Python では変数宣言はありません.変数に値が代入された時点で変数のオブジェクトが生成されます.プログラムのどこで,どんなタイミングで変数が生成されるかが重要です.それにより,変数の有効範囲 (スコープ) が決まります.

消滅

値を表すオブジェクトは,変数で参照されなくなると役に立たなくなります.その値を操作することができなくなるからです.そうなると,ガベージコレクション(ゴミ収集)の対象になり,適当なタイミングで,Python がメモリーから消去します.

スコープ

変数や関数が使える範囲をスコープと言い,それはこれらが属する名前空間により決まります.名前空間は,これらの変数や関数が作られた場所とタイミングにより決まります.ここでは,変数のオブジェクトを用いて,スコープについて説明します.オブジェクトが関数やクラスでも同じように振る舞います.

LEGBルール

Python の基本的なスコープは次の4つ,(1)ローカルスコープ:Local Scope,(2)外側の関数のスコープ:Enclosing function's scope,(3)グローバルスコープ:Global,(4)ビルトインスコープ:Built-inに分類できます.これらはプログラムの階層構造内側から順序付けられ,その順序通りにオブジェクトの名前の検索が行われます.これを LEGB ルールと呼びます.名前が見つかればオブジェクトと対応付けられます.そして,検索は終わります.このルールは特に変わったことはなく,他のプログラミング言語と同じように振る舞います.

LEGB ルールの振る舞いを以下のプログラムで示します.このプログラムには3つの同じ名前の変数 variable があります.それぞれは,ローカルスコープ,外側の関数のスコープ,グローバルスコープです.また,ビルトインスコープの例として,__name__ の値を表示します.

LEGB ルールの例(scope01.py)

001   #!/usr/bin/python3
002   
003   variable = 33                     # Global scope
004   
005   def func():
006       variable = 22              # Enclosing function's scope
007       print(variable)
008       def func():
009           variable =11         # Local scope
010           print(variable)
011       return func
012   
013   print(__name__)       # show builtin variable: __main__
014   print(variable)          # show global variable: 33
015   f=func()                   # show enclosing function's scope variable: 22
016   f()                           # show local variable: 11

このプログラムを実行すると,以下の結果が得られます.最初の __main__ は変数 __name__ の値で,プログラム実行時に代入されます.続く 33 はグローバルスコープの variable の値,22 外側の関数のスコープの variable の値,11 はローカルスコープ variable の値です.同じ名前の変数 (オブジェクト) があっても,衝突することがありません.

__main__
33
22
11

モジュールを使う場合

モジュールをインポートすると,それも名前空間の一つの階層になります.そのモジュール毎の階層内では,LEGB ルールが適用されます.モジュールはインポート方法により,名前空間が変わることがあります.詳細は,別ページのモジュールを参照ください.

モジュールを使った場合のスコープの例を以下に示します.

モジュールを使った場合の LEGB ルールの例(scope02.py)

001   #!/usr/bin/python3
002   
003   variable = 44               # gloval
004   
005   def func():
006       variable =33 
007       return variable
008   
009   import mod
010   
011   print(variable)             # Global  44
012   print(func())               # Lolcal  33
013   print(mod.variable)         # Global in module  22
014   print(mod.func())           # Local in module   11

モジュール(mod.py)

001   #!/usr/bin/python3
002   
003   variable = 22                  # Global in module
004   
005   def func():
006       variable = 11              # Local in module
007       return variable

このプログラム(scope02.py)を実行すると,以下の結果が得られます.まずは,003 行目でグローバル変数が作成され,値が代入されます.そして,009 行目でモジュール (mod.py) がインポートされます.011 行目では LEGB ルールに則り検索が行われ,最初に見つかるグローバル変数の variable の値が表示されます.012 行目は関数 func() が実行され,戻り値であるそのローカル変数の値が表示されます.013 行目ではモジュール内で,LEGB ルールが適用され,そのグローバル変数が表示されます.014 行目では,モジュールの関数 func() が実行され,戻り値であるそのローカル変数の値が表示されます.

44
33
22
11

クラスを使う場合

クラス内の変数のスコープも LEGB ルールに従います.クラスもモジュール同様に名前空間のツリーのひとつブランチのように振る舞います.そこで,このルールが適用します.クラスの変数については,別ページの変数のところに詳細を示します.

クラスを使った場合のスコープの例を以下に示します.

クラスを使った場合のスコープの例(scope03.py)

001   #!/usr/bin/python3
002   
003   variable = 33                     # Global scope
004   
005   class Ex_Class:
006       variable = 22                 # calass  variable
007       def __init__(self):
008           self.variable =11         # instance variable
009       def get(self):
010           return self.variable
011   
012   
013   a = Ex_Class()
014   
015   print(variable)            # Global  33
016   print(Ex_Class.variable)   # Class variable  22
017   print(a.get())             # Instance variable  11

このプログラムを実行すると,以下の結果が得られます.まずは,003 行目でグローバル変数が作成され,値が代入されます.そして,013 行目でクラスのインスタンスが作成されます.その際,006 行目でクラス変数と呼ばれるクラス内のグローバル変数が作成されます.次に,007 &ndash 008 行目で,インスタンスのローカル変数が作成されます.015 行目では LEGB ルールに則り検索が行われ,最初に見つかるグローバル変数の variable の値が表示されます.016 行目はクラス変数 variable の値が表示されます.017 行目ではインスタンス内で,LEGB ルールが適用され,そのローカル変数が表示されます.

33
22
11

変数の型

数値

Python には変数の宣言がありませんが,数値型を持ちます.

数値型 例(リテラル) 備考
整数型 325, -90825, 0 C言語の long に相当
整数型 (2進数) 0b11011, 0b10101
整数型 (8進数) 0o775, 0o37612
整数型 (16進数) 0xff34, 0xBD98A
長整数 498599856L, -128L 無限の精度があります
浮動小数点型(実数) 3.14, 6.626e-34, 1.602E-19 C言語の double に相当
浮動小数点型(複素数) 5.0+3.4j, 4.18+9.3J C言語の double _Complex に相当
28.45e3+3.98e-23

ちょっと気持ち悪いですが,虚数単位は「j」あるいは「J」です.

時々,文字列→整数,あるいは文字→浮動小数点の型の変換が必要なことがあります.そのためには,int() あるいは float()関数,complex()関数を使います.具体的には,次のようにします.ひとつの文字列や文字列のリストを数値に変換し,二倍しています.

文字列を数値に変換(change_type.py)

001   #!/usr/bin/python3
002   
003   if __name__ == "__main__":
004   
005       i  = "123"
006       il = ["1", "2", "3"]
007   
008       f  = "1.23"
009       fl = ["2.45", "3.4e-45"]
010   
011       c  = "1.2+3.4j"
012       cl = ["1.2+3.4j", "3.14e-3+2.71e3j"]
013   
014   
015       print("\n-- to int ---")
016       print("\t", int(i)*2)
017       print("\t", list(map(lambda x: 2*int(x), il)))
018   
019       print("\n-- to float ---")
020       print("\t", float(f)*2)
021       print("\t", list(map(lambda x: 2*float(x), fl)))
022   
023       print("\n-- to complex ---")
024       print("\t", complex(c)*2)
025       print("\t", list(map(lambda x: 2*complex(x), cl)))

文字列のリストを数値に変換するために,map() 関数を使っています.その中で,ラムダ式(無名関数)を使って,要素毎に操作します.そして,list() でリストにします(??).実行結果は,次のとおりです.

-- to int ---
	 246
	 [2, 4, 6]

-- to float ---
	 2.46
	 [4.9, 6.8e-45]

-- to complex ---
	 (2.4+6.8j)
	 [(2.4+6.8j), (0.00628+5420j)]

コレクション型

リスト

リストの要素数は len(リスト名) で取得できます.

クラスを使い構造体を表現

構造体は大変便利な機能です.私は実験や計算のデータ処理をすることが多く,構造体が使えないと,いろいろと困ります.そこで,クラスを使った構造体の実現方法を示します.

ほとんど構造体

メソッド (関数) のないクラスを使うとC言語の構造体とほとんど同じことができます.書き方も C 言語と似ています.以下のプログラムで使い方を示します.

クラスを使った構造体(structure01.py)

001   #!/usr/bin/python3
002   
003   #=========================================
004   # like a structure by usging class
005   #=========================================
006   class structure:
007       memberT = ""
008       memberN = float("nan")
009       memberA = [float("nan")]*100
010   
011   #=========================================
012   # main function
013   #=========================================
014   if __name__ == "__main__":
015       st = structure
016       st.memberT = "10th prime number"
017       st.memberN = "29"
018       st.memberA[29] = 3.141592653589793
019   
020       print(st.memberT)
021       print(st.memberN)
022       print(st.memberA[29])

このプログラムを実行すると,以下の結果が得られます.006行目からクライスの定義の開始です.007&ndash:009行目で,構造体のメンバーであるクラス変数を定義し初期値を代入します.nan は not a number で,値がないことを明示します.015–022 では,ドットを使うことにより,構造体のメンバーへのアクセス(代入と呼び出し)ができることを示しています.C言語の構造体とほとんど同じ使い方ができます.

ただし,この方法には大きな欠点が有ります.クラス変数を使っているため 1 つの構造体しか利用できません.複数のインスタンスを作っても,全てのクラス変数の値は同一になります.

10th prime number
29
3.141592653589793

クラスに見える

ページ作成情報

参考資料

  1. str.formatについては,以下の書籍のp.76—p.86を参考にしました.
    Python 3 プログラミング徹底入門Python 3 プログラミング徹底入門
    マーク・サマーフィールド Mark Summerfield 長尾 高弘

    ピアソンエデュケーション 2009-12-15
    売り上げランキング : 124305

    Amazonで詳しく見る
    by G-Tools

更新履歴

2014年12月14日 ページの新規作成


no counter