質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
参照

参照は、プログラミングにおいて変数や関数といったメモリ空間上での所在を指示するデータのことを指します。その中にはデータ自体は含まれず、他の場所にある情報を間接的に指示するプログラムです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

14289閲覧

Python:複数ファイルにまたがるグローバル変数参照方法について

deepmoon_papa

総合スコア1

参照

参照は、プログラミングにおいて変数や関数といったメモリ空間上での所在を指示するデータのことを指します。その中にはデータ自体は含まれず、他の場所にある情報を間接的に指示するプログラムです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/10/13 23:24

前提・実現したいこと

Pythonにおいて、
複数ファイルにまたがり、グローバル変数の共有がしたいです。
コードは書きましたが、中途半端な共有しかできないようです。
グローバル変数を正しく参照するにはどうすればよいか、教えていただければ助かります。

発生している問題・エラーメッセージ

中途半端とは、グローバル変数の宣言をしている親.pyと、グローバル変数の参照をする子.pyがあり、
親.pyでは、グローバル変数宣言で初期値を代入し、その変数を別の値に上書きした上で、子.pyの関数をコールしていますが、
子.pyがグローバル変数を参照すると、初期値が見え、親.pyで上書きした値になりません。

該当のソースコード

python

1ファイル名:oya.py 2import ko 3 4# -------------------------------------------------- 5# グローバル変数定義 6# -------------------------------------------------- 7g ='aaa' 8 9# -------------------------------------------------- 10# メイン処理 11# -------------------------------------------------- 12def main(): 13 global g 14 print ('1-1 main()の最初⇒'+g) 15 g ='bbb' 16 print ('1-2 main()の2回目⇒'+g) 17 ko.subFunc() 18 print ('1-3 main()の最後⇒'+g) 19 20 21if __name__ == "__main__": 22 main()

python

1ファイル名 ko.py 2import oya 3 4def subFunc(): 5 6 print ('2-1 subFuncの最初⇒'+oya.g) 7 8 oya.g='zzz' 9 10 print ('2-2 subFuncの最後⇒'+oya.g)```

試したこと

上記PGのように各所にprint分を入れること、関数内でグローバル変数を書き換えるなどを試行した。
上記PGの動作結果は下記となった。

python

1実行結果 21-1 main()の最初⇒aaa  31-2 main()2回目⇒bbb 42-1 subFuncの最初⇒aaa 52-2 subFuncの最後⇒zzz 61-3 main()の最後⇒bbb

1-1 main()の中でグローバル変数の初期値が参照できた。 想定通り
1-2 main()の中で変更したグローバル変数の値が参照できた。 想定通り
2-1 subFunc()の中からグローバル変数を参照できたのは想定通りですが、その値が初期値であることは想定外。
2-2 subFunc()の中で変更したグローバル変数の値が参照できた。想定通り
1-3 グローバル変数はsubFunc()の中で変更しているが、main()関数の中で変更した最後の値が見えている。想定外

### 環境
Python 3.9.6
VS Code 1.61.0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ここを読んでください。

https://docs.python.org/ja/3/library/main.html

'__main__' はトップレベルのコードが実行されるスコープの名前です。モジュールが、標準入力から読み込まれたとき、スクリプトとして実行されたとき、あるいはインタラクティブプロンプトのとき、__name__ には '__main__' が設定されます。


python oya.py

と実行すると、pythonはoya.pyを**__main__という名前のモジュールとして**ロードします。

その後__main__内でkoをインポートしていますから、ko.pyが読みこまれモジュールとしてロードされます。
ko内でoyaをインポートしていますから、oya.pyが読みこまれモジュールとしてロードされます。

つまり、oya.pyは2回読みこまれ、__main__というモジュールとoyaというモジュールの、2つの別々のモジュールとして存在しています。


1-1 main()の最初⇒aaa 
1-2 main()の2回目⇒bbb
1-3 main()の最後⇒bbb

で表示されているg__main__に束縛されているもの(完全名で書くと__main__.g)です。

2-1 subFuncの最初⇒aaa
2-2 subFuncの最後⇒zzz

で表示されているgoyaに束縛されているもの(完全名で書くとoya.g)です。

投稿2021/10/13 23:40

quickquip

総合スコア11202

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問