はじめに
robotframeworkからpythonソースコードを呼び出すことがあり、プログラム間でやり取りをしていると変数のスコープで躓くことがありました。
robotframework→pythonの関数呼び出し→robotframework→pythonの関数呼び出し…
というようにしていると、グローバルで宣言した変数をPythonの関数(ローカルスコープ)で値の変更をしても別関数を呼び出したときには変更されていませんでした。
今回はpythonでのグローバル変数をローカルスコープで利用&変更する方法についてです。
サンプルソース
com_valというグローバル変数を宣言し、各関数からcom_valを操作したサンプルソースです。
com_val ="0"
def func_1():
com_val ="1"
print("func_1内から呼び出し:" + com_val)
def func_2():
global com_val
com_val ="2"
print("func_2内から呼び出し:" + com_val)
print(com_val)
func_1()
print(com_val)
func_2()
print(com_val)
これを実行すると
0
func_1内から呼び出し:1
0
func_2内から呼び出し:2
2
となります。
ソースの解説です。
まず1行目でcom_valを宣言しています。
プログラムは上から順に実行されます。
(関数などは呼び出されない場合は実行はされない)
1行目実施後は、関数を飛ばすので次に14行目が実行されます。
そこではまずcom_valの値(関数呼び出し前)を表示。
次に15行目ではfunc_1()を呼び出しています。
func_1()ではcom_valに値を設定していますが、これはfunc_1()内のローカル変数に値を入れているだけでグローバル変数の値は変更されません。
実際16行目でprintをしてもcom_valの値が変更されていないことが分かります。
その後18行目でfunc_2()を呼び出しています。
func_2()ではglobalキーワードを使っています。
これは「global変数を利用しますよ」と明示的に宣言することで、ローカルからでもグローバル変数を利用できるようになります。
19行目ではcom_valの値が変更されていることがわかると思います。
おわりに
今回はPythonでのローカルスコープからグローバル変数を変更する方法についてでした。
一般的にグローバル変数を利用するのは開発上避けるべきとされています。
(どこで値が変更されているのかがわからなくなる)
とはいえ、利用したい場合も当然ありますし、個人で作っている小さなプログラムやスクリプトなどの場合は使うのもアリだと思います。
開発上、値の変更が分かりにくいという点はデメリットですが、リスクとメリットを考えて使えばよいかと。
また知っておいて良い知識の一つではないかと思います。
この記事がお役に立ったのなら嬉しいです。
最後までお読みいただきありがとうございます。