【问题标题】:Accessing a variable outside of a while loop, Python在while循环之外访问变量,Python
【发布时间】:2012-06-17 14:20:52
【问题描述】:

我正在编写一个 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 始终为零。你有什么想法吗?

只需用 coh0 交换 foo1 编辑:

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)

【问题讨论】:

  • 您的示例在您引用 foo1 之前不起作用。请给出一个简单的、独立的、工作的例子。
  • 如果您的获取和添加部分在函数内部,请确保在完成后返回您的值。
  • 不要只是转储你的代码,给我们一个Short, Self Contained, Correct, Example
  • 是的,我更正了。不知道 SSCE 是什么,抱歉 :)
  • 这还是太多了。您需要创建最简单的代码来显示您的问题。请阅读我提供的链接,然后更新您的问题。

标签: python sockets variables loops while-loop


【解决方案1】:

线

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

有效地执行整数除以 60000 - 它可以等效地写为

coh0 //= 60000

如果coh0在执行此行之前恰好小于60000,则执行后为0。

在我的 while 循环内 foo1 正确加起来。但在循环之外foo1 始终为零。

这是描述正在发生的事情的一种非常误导性的方式。正如您自己注意到的那样,循环内它已经为零。

【讨论】:

  • 当然……简单的数学!非常感谢。 PS:谢谢大家把我介绍给SSCE
  • @kory:很高兴为您提供帮助。顺便说一句,编写一个简单的、独立的示例的主要目的是,它通常会帮助您自己发现错误。
【解决方案2】:

您的示例不起作用,因为您没有为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

请注意,这是一个非常人为的示例,您实际上想要这样做的情况很少见。

请给我们一个Short, Self Contained, Correct, Example,它显示您的代码产生了您不想要的结果,以及您想要的结果。因为您的问题在 Python 中根本不存在。

【讨论】:

  • 我将为您提供我的代码。可能我的解释是错误的:)
  • @kory:请参阅上面答案中的链接。为了提供帮助,我们需要一个 Self Contained 示例来显示您的问题。不能指望我们都在 20480 上设置一些本地服务器,阅读德语,设置 sqllite 等等。
【解决方案3】:

你必须在循环之前声明 foo1

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

在您的情况下,变量 foo1 仅在 while 循环中具有可见性范围,当您在循环外使用它时,它只是在全局范围内再次创建。

【讨论】:

  • 这正是我所做的:)
  • @kory 请更新您的代码,您是如何使用它的。问题出在 foo 变量的范围内
  • @kory 可以提供您对代码的使用情况,因为如果您的代码有问题,它必须有效。如果在函数中使用,那就另当别论了
  • 这不是真的。在 Python 中,while 循环没有单独的命名空间。您不需要 需要 这样做(尽管大多数时候这样做更有意义)。 -1.
  • 它绝对在任何功能之外,因为我没有使用任何功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多