【问题标题】:store 2 values in one variable?将 2 个值存储在一个变量中?
【发布时间】:2012-07-10 12:11:29
【问题描述】:

我想知道,有没有一种方法可以在我的 main 方法中存储开始值和结束值。我尝试这样做,但它给了我错误:

def searchM():

    fileAddress = '/database/pro/data/'+ID+'.txt'
    with open(fileAddress,'rb') as f:
        root = etree.parse(f)
        for lcn in root.xpath("/protein/match[@dbname='M']/lcn")
            start = int(lcn.get("start"))#if it is PFAM then look for start value
            end = int(lcn.get("end"))#if it is PFAM then also look for end value
    return "%s, %s" % (start, end,)

values = searchM()

(start, end,) = values

错误信息是 UnboundLocalError: local variable 'start' referenced before assignment

【问题讨论】:

  • 这行代码:return "%s, %s" % (start, end,)start 未被分配的情况下被执行。现在有end。即使您修复它,(start, end,) = values 也无法正常工作。你不能将一个字符串解压成两个变量。
  • @DavidHeffernan 我应该怎么做才能获得这两个值?
  • 好吧,只需将它们返回一个元组:return (start, end)。然后像这样解压它们:(start, end) = searchM()。显然,您需要确保分配了 startend
  • @DavidHeffernan 非常感谢您
  • 使用return start, end。请注意,您不需要括号(在这种情况下,逗号会创建一个元组)

标签: python store


【解决方案1】:

您遇到的错误是由 startend 变量引起的。尝试先初始化它们,使它们即使在没有设置值的情况下也存在。

此外,您正在尝试创建并返回一个字符串,然后将其解压缩为两个不同的变量。

尝试以下方法:

def searchM():
    fileAddress = '/database/pro/data/%s.txt' % ID
    start = None
    end = None
    with open(fileAddress,'rb') as f:
        root = etree.parse(f)
        for lcn in root.xpath("/protein/match[@dbname='M']/lcn"):
            start = int(lcn.get("start")) #if it is PFAM then look for start value
            end = int(lcn.get("end")) #if it is PFAM then also look for end value
    return start, end

(start, end) = searchM()  

【讨论】:

  • 我可以使用它来调用另一种方法的开始值和结束值吗?我将如何在另一个方法上调用这些开始和结束值
  • 使用values = searchM()..(start, end,) = values。尽管像您当前所做的那样,首先将返回的值分配给变量并不是必需的。您可以简单地将结果返回给所需的变量:(start, end) = searchM()
  • 有没有办法让 start = '' 和 end ='' 作为 int 而不是字符串,因为当我稍后编译整个代码时,我使用 list[start]。编译器不让我这样做,因为它是一个字符串
  • 将它们初始化为start = 0end = 0
  • 没有冲突;如果更改名称,您将收到相同的错误。如果它们是有效索引,即如果 lcn.get() 可以返回 0,则对于“未找到”情况返回 0,0 是不正确的
【解决方案2】:

如果没有找到startend,则需要提供它们的值:

for lcn in root.xpath("/protein/match[@dbname='M']/lcn"):
    start = int(lcn.get("start"))
    end = int(lcn.get("end"))
    break
else: # not found
    start = end = None

【讨论】:

  • 表达了我理解的作者意图
  • 你很可能是正确的,但我只是想明确说明
  • @J.F.Sebastian 非常感谢。我能再问你一个问题吗?我需要在另一种方法上使用开始和结束值来制作列表。但它告诉我该值不能是 NoneType 或 str。我将如何解决这个问题?
  • @ChadD: None 值表示 xpath 返回空列表,即没有找到任何内容。您应该做什么取决于稍后将如何在您的代码中使用该列表。
  • @DavidHeffernan:我同意。感谢您提及它
猜你喜欢
  • 1970-01-01
  • 2022-01-22
  • 2022-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多