1

特定のポートからデータを取得する Python スクリプトを作成しています。そのため、ポートが開いている限り、データを取得する while ループが発生しました。この while ループでは、変数を追加していますfoo1。時間切れになったら、それ以上データを取得したくありません。

したがって、擬似コードは次のようになります。

foo1 = 0

try:

   while True:
       fetch data
       foo1 = foo1 + 500

       if time up:
           break

finally:
    close socket

print foo1

私のwhileループの中でfoo1正しく加算されます。しかし、ループの外側 foo1は常にゼロです。何か考えはありますか?

foo1coh0 editと交換するだけ です:

import re

coh = [0]
nachricht = ' S="0" '
coh0 = 0
time = 0
try:
    while True:
        time += 1
        coh = re.findall(r'\bS="\d"', nachricht)
        coh_value = re.findall(r'\d', coh[0])  

        if coh:
            if int(coh_value[0]) == 0:
                coh0 = int(coh0) + 500
                print coh0


        if time == 10:        
            coh0 = int((int(coh0)/500)/120)

            print "Here coh0 is zero again",int(coh0)
            break
finally:
    pass

print "Here coh0 is zero again",int(coh0)
4

3 に答える 3

4

この線

coh0 = int((int(coh0)/500)/120)

60000 による整数除算を効果的に実行します。

coh0 //= 60000

coh0この行を実行する前にたまたま 60000 未満だった場合、後で 0 になります。

私のwhileループの中でfoo1正しく加算されます。しかし、ループの外側foo1は常にゼロです。

これは、何が起こっているのかを説明するのに非常に誤解を招くものです。お気づきのとおり、ループ内ではすでにゼロになっています。

于 2012-06-14T15:22:31.927 に答える
1

の初期値を宣言していないため、この例は機能しません。そのため、この例foo1は存在せずに参照します。これにより、がスローされNameErrorます。初期値を宣言すると、コードは機能します。

>>> x = 0
>>> while True:
...    x += 1
...    if x > 10:
...        break
... 
>>> x
11

それだけでなく、Pythonはwhileループで名前空間を作成しないため、コードがwhileループ内でyになるように変更された場合でも、次のように機能します。

>>> start = True
>>> while True:
...     if start:
...         y = 0
...         start = False
...     y += 1
...     if y > 10:
...         break
... 
>>> y
11

これは非常に工夫された例であり、実際にこれを実行することはほとんどありません。

必要な結果とともに、不要な結果を生成するコードを示す、短く、自己完結型の、正しい例を教えてください。あなたの問題はPythonには存在しないからです。

于 2012-06-14T14:21:14.797 に答える
-1

ループの前にfoo1を宣言する必要があります

foo1 = 0
while True:
    fetch data
    foo1 = foo1 + 500

あなたの場合、変数foo1はwhileループでのみ可視性スコープを持ち、ループ外で使用すると、グローバルスコープで再び作成されました。

于 2012-06-14T14:16:58.910 に答える