

module内変数にアクセスするな、というお叱りの言葉を受けそうですが、main.pyでaを100にする方法はないのでしょうか？

[code]

    # main.py
    from sub import *
    foo()
    print(a) # 0が表示される T-T)/
    
[/code]

[code]

    # sub.py
    a = 0
    def foo():
        global a
        a = 100
    
[/code]

また、不思議なのは、以下のようにすると100が表示されることです。

[code]

    # main.py
    from sub import *
    baa() # 100が表示される　
    
[/code]

[code]

    # sub.py
    a = 0
    def foo():
        global a
        a = 100
    def baa():
        print(a)
    
[/code]

T^T)/ よろしくお願いいたします。


CC BY-SA 4.0
2022-03-05T08:16:37.773
86701
2022-03-05T10:00:03.900
2022-03-05T08:32:02.750
3060
51697
question
python python3
Python でモジュール内変数の謎な動き


この記事の回答やPythonのドキュメントが参考になるでしょう。この記事自体の`import`とグローバル変数が何処に定義されているかは今の質問とは違いますが。  
その回答の中で、3つのパターンの対処が説明されています。  
[Visibility of global variables in imported
modules](https://stackoverflow.com/q/15959534/9014308)

> Globals in Python are global to a module, not across all modules. (Many
> people are confused by this, because in, say, C, a global is the same across
> all implementation files unless you explicitly make it `static`.)

> PythonのGlobalsは、すべてのモジュールにまたがるわけではなく、(個々の)モジュールに対してglobalです。
> （たとえば、C(言語)では、明示的に`static`にしない限り、globalはすべての実装ファイルで同じであるため、多くの人がこれに混乱しています。）

つまり`main.py`で`sub.py`を`import`してアクセス出来る`a`と、`sub.py`の中からアクセスできる`a`は違う物だということです。

* * *

同様のことは以下のPythonのドキュメントにも記述されています。

[グローバル変数をモジュール間で共有するにはどうしたらいいですか？](https://docs.python.org/ja/3/faq/programming.html#how-
do-i-share-global-variables-across-modules)

> 一つのプログラムのモジュール間で情報を共有する正準な方法は、特別なモジュール (しばしば config や cfg と呼ばれる)
> を作ることです。単に設定モジュールをアプリケーションのすべてのモジュールにインポートしてください。

そして両方の記事とも、`モジュール名.`を変数の頭に付けてアクセスするよう説明されています。


CC BY-SA 4.0
2022-03-05T09:52:58.103
86703
2022-03-05T10:00:03.900
2022-03-05T10:00:03.900
26370
26370
86701
answer