Python在循环外获取变量

时间:2014-08-20 13:45:59

标签: python variables

我有一个python代码,我需要在for循环和if语句之外获取它的值并进一步使用该变量:

我的代码:

with open('text','r') as f:
  for line in f.readlines():
      if 'hi' in line
         a='hello'

print a  #variable requires outside the loop

但我得到Nameerror: 'a' is not defined

4 个答案:

答案 0 :(得分:6)

错误消息表示您从未分配到a(即if条件从未评估为True)。

为了更优雅地处理这个问题,你应该在循环之前为a分配一个默认值:

a = None
with open('test', 'r') as f:
   ...

然后,您可以在循环后检查它是否为None

if a is not None:
   ...

答案 1 :(得分:3)

您也可以尝试:

try:
    print a
except NameError:
    print 'Failed to set "a"'

编辑: 如果你没找到你想要的东西,它同时解决了不打印 a 的问题

答案 2 :(得分:2)

此处的其他答案是正确的 - 您需要保证在尝试打印之前已为a分配了值。但是,其他答案都没有提及Python's for ... else construct,我认为正好你需要的是什么:

with open('text','r') as f:
  for line in f.readlines():
      if 'hi' in line:
          a='hello'
          break
  else:
      a='value not found'

print a  #variable requires outside the loop

else子句仅在for循环完成其最后一次迭代而没有break时才会运行。

根据我的经验,这个结构似乎是Python独有的。它可以很容易地用支持goto的语言实现,但Python是我所知道的唯一一种专门用于此的内置构造的语言。如果你知道另一种这样的语言,请发表评论并启发我!

答案 3 :(得分:-1)

只需定义app.js const rateLimit = require('express-rate-limit'); const rateLimiter = rateLimit({ windowMs: 1 * 60 * 1000, max: 5, statusCode : 403, message: 'You have exceeded the 5 requests in 1 min limit!', headers: true, }); router.get("/call_api", checkauth,rateLimiter, async function(req,res,next) { await fetch("http://localhost:8000/get_number", { method : "GET", // headers: {'Content-Type': 'application/json'}, }) .then((response) => response.json()).then((response1) => { res.status(200).json({ number : response1.number }); }) // res.status(200).json({ // message : "Generating a random number" // }) }); router.get("/remaining_limit",checkauth,rateLimiter, (req,res) => { res.status(500).json({ remaining_limits : "You have _ remaining limits" //the number of remaining limits }); }) 因此成为一个全局变量,您就可以在代码中的任意位置访问