2012-06-14 4 views
1

Я пишу скрипт Python для извлечения данных из определенного порта. Итак, у меня есть цикл while, который извлекает мои данные, пока порт открыт. В этом цикле while я добавляю переменную, назову ее foo1. Когда время заканчивается, я больше не хочу получать данные.Доступ к переменной за пределами цикла while, Python

Так псевдокод будет выглядеть следующим образом:

foo1 = 0 

try: 

    while True: 
     fetch data 
     foo1 = foo1 + 500 

     if time up: 
      break 

finally: 
    close socket 

print foo1 

Внутри моего время цикла foo1 добавляет правильно. Но вне цикла foo1 всегда равен нулю. Есть ли у вас какие-либо идеи?

Просто обмен foo1 с coh0 редактирования:

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) 
+0

Ваш пример не работает, поскольку вы ссылаетесь на 'foo1' до его существования. Пожалуйста, дайте простой, автономный, ** рабочий пример. –

+0

Если часть выборки и добавления находится внутри функции, убедитесь, что вы вернули свое значение после завершения. –

+1

Не просто сбрасывайте свой код, дайте нам [Short, Self Contained, Correct, Example] (http://sscce.org/). –

ответ

4

Линия

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

эффективно выполняет целочисленное деление на 60000 - это может быть эквивалентно записать в виде

coh0 //= 60000 

Если coh0 случается быть меньше, чем 60000 перед выполнением этой линии, ее после этого будет 0.

Внутри моей петли foo1 складывается правильно. Но вне цикла foo1 всегда равен нулю.

Это очень вводящий в заблуждение рассказ о том, что происходит. Как вы заметили, в петле уже будет ноль.

+0

Конечно ... простая математика! спасибо. PS: Спасибо, что ознакомили меня с SSCE – kory

+0

@kory: Рад помочь. Ключевым моментом написания простого, самодостаточного примера является, кстати, то, что он обычно поможет вам найти свою ошибку самостоятельно. –

-1

Вы должны объявить Foo1 перед циклом

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

Variable foo1 в вашем случае имели видимость рамки только в , а, и когда вы использовали его из цикла, он снова был создан в глобальном масштабе.

+0

Я уже и даже пытался объявить его глобальным. – kory

+0

Это именно то, что я сделал :) – kory

+0

@kory, пожалуйста, обновите свой код, как вы его использовали. Проблема является defenitely в области определения переменной foo – Ribtoks

1

Ваш пример не работает, потому что вы не объявляете начальное значение для foo1, поэтому вы ссылаетесь на него без его наличия - это вызовет NameError. Если вы объявляете начальное значение, то код будет работать:

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

Не только это, но Python не пространство имен в цикле в то время, так что даже если ваш код был изменен, чтобы сделать у внутри время цикла, он будет работать:

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

Примечание это очень надуманный пример, и это редко, в лучшем случае вы на самом деле хотите, чтобы сделать это.

Пожалуйста, дайте нам Short, Self Contained, Correct, Example, который показывает ваш код, создавая результат, который вам не нужен, а также результат, который вам нужен. Поскольку ваша проблема просто не существует в Python.

+0

Я предоставлю вам мой код. Вероятно, мое объяснение ошибочно :) – kory

+0

@kory: см. Ссылку в ответе выше. Чтобы помочь, нам нужен пример «Self Contained», показывающий вашу проблему. Мы не можем все ожидать, чтобы настроить локальный сервер на 20480, прочитать по-немецки, установить sqllite и т. Д. И т. Д. – sberry

Смежные вопросы