私はPython 3.5で書かれたプログラムの一部を持っており、最初の2つのモジュールをテストすることから始めました。モジュールの1つで、2つのグローバル変数が理解できない理由で元の値に戻っているように見える問題を切り分けることができました。これらのグローバル変数の1つ(event_count
)は、単一の関数(grepは文字列 "event_count"がmy * .pyファイルのどこにも現れないことを示します)でのみ使用されますが、変数の値は関数。このモジュールの他のグローバル変数のprintステートメントを追加すると、同時にその元の値に戻ります。 event_count
を別のモジュールに移動すると、sensorlogic.event_count
がeventcount()
になり、初期化を他のモジュールに移動すると動作が終了するため、修正済みですがわかりません。ここでPythonモジュールのグローバル変数は自動的にリセットされます
はモジュールsensoreval
で、event_count
を使用するすべてのコードです:
event_count = 0
def eventcount(increment):
global event_count
print("entering eventcount, increment =", increment,
", event_count =", event_count)
event_count += increment
print("leaving eventcount, event_count =", event_count)
return event_count
私は次のコードセグメント実行した場合:
e.setvalue(1)
print("I am at marker #1")
eventcount(0)
を(e.setvalue()
の最後のアクションがへの呼び出しでありますeventcount(0)
)この出力を生成します:
entering eventcount, increment = 0 , event_count = 4
leaving eventcount, event_count = 4
I am at marker #1
entering eventcount, increment = 0 , event_count = 0
leaving eventcount, event_count = 0
私は2つのモジュールを妥当なサイズにトリミングしようとしましたが、そうしても問題は解決しません。私はそれに取り組んでいきます。以前はPython 3を使ったことがなく、ちょっとしたPython 2.7の経験しかなかったので、私は何か愚かなことをしていると思っています。何も分かりません。
私の例は、変数event_count
がグローバルであるだけで静的になるという点で指摘されているいくつかの関連記事とは異なると私は信じています。この単一の関数でのみ使用されます。文字列 "event_count"は、このモジュールまたは他のモジュールのどこにも表示されません。
多くの編集/再実行の繰り返しの後で、私は何が起こっているかを実証する非常に小さな例があります。これには、合計8行のコードを持つ2つのモジュールが含まれます。第一のモジュール、a.py
、__main__
である:
import b
c = 0
if __name__ == '__main__':
b.init()
print("c =", c)
第二モジュールがb.py
ある:a.py
実行
import a
def init():
a.c = 1
は出力を生成します
c = 0
Iはc
はまだから1であることが期待しましたa.c = 1
はb.py
です。私はどちらか、それを説明することはできませんが、それが関連していると思わ
Traceback (most recent call last):
File "...\a.py", line 1, in <module>
import b
File "...\b.py", line 1, in <module>
import a
File "...\a.py", line 3, in <module>
b.init()
AttributeError: module 'b' has no attribute 'init'
:
はまた、私はa.py
からif __name__ == '__main__'
を削除することによって、このさらなるを削減しようとしていないが、その後の例では、もはや実行されます。
私は次のコードが何が起こっているのかを示していると信じています。 3つのモジュールが含まれています。a.py
:
print("__name__ =", __name__)
import b
print("__name__ =", __name__)
def f(): pass
print(f)
if __name__ == '__main__':
print("f is b.a.f?", f is b.a.f)
b.py
:
import a
c.py
:
import a
import b
print("__name__ =", __name__)
print("a.f is b.a.f?", a.f is b.a.f)
あなたは結果を与え、a.py
を実行することによって、問題を見ることができます:
__name__ = __main__
__name__ = a
__name__ = a
<function f at 0x0000021A4A947840>
__name__ = __main__
<function f at 0x0000021A484E0400>
f is b.a.f? False
インポートサイクルの結果の一部ではないように、
はc.py
を実行中:
__name__ = a
__name__ = a
<function f at 0x000001EA101B7840>
__name__ = __main__
a.f is b.a.f? True
[グローバル変数を作成した関数以外の関数でグローバル変数を使用する]の可能な複製(http://stackoverflow.com/questions/423379/using-global-variables-in-a-function-other-than-作成したもの) – rll
これは関連しています:http://stackoverflow.com/q/3536620/4996248 –
問題が消えてしまうように調整することが何であれ、手がかりが必要です。また奇妙なことに、あなたの出力には 'event_count'が実際にはインクリメントされていないと表示されます。 –