【问题标题】:Mandatory While Loop Gives Local Variable Might Be Referenced Before Assignment强制 While 循环给出局部变量可能在赋值前被引用
【发布时间】:2020-03-06 06:26:35
【问题描述】:

我遇到的问题是不可能不跳出 while 循环,AKA“matched_index”将始终被定义,但我的 IDE 抛出“可能在分配前被引用”错误。对此进行编码的 Pythonic 方式是什么?我找到的最接近的是this post,但我不确定如何编写 kindall 的建议。

这是我的代码:

        another_list = [0] * len(my_list)
        if X in my_list:
            i = 0
            while i < len(my_list):
                if X == my_list[i]:
                    matched_index = i
                    break
                i += 1
            another_list[matched_index] = 0.2

【问题讨论】:

  • pythonic 方法是使用 for 循环,但问题仍然存在。一个解决方案是在循环体之外定义你的matched_index。注意,如果my_list 为空,循环体将不会执行,这就是警告的含义
  • 注意,你的 IDE 给你一个警告,这不是错误。
  • 对于您的第二条评论,我意识到这是一个警告而不是错误,但我只是好奇如何更好地编码。问题是 my_list 不能为空,所以我需要弄清楚如何修复警告。
  • 您可以忽略警告。没有什么可以“修复”的。

标签: python python-3.x


【解决方案1】:

只需初始化matched_index,或将赋值语句移到循环中(这样您就不会使用另一个临时变量来保存它)。

虽然从逻辑的角度来看,代码不会遇到len(my_list) == 0 的场景,但词法分析器无法保证它。

【讨论】:

  • 在这种情况下,将定义留在原处可能会很好,因此如果您认为列表始终非空的假设不成立,则代码将快速失败...
  • 在循环之前初始化matched_index的问题是我不确定我应该将它设置为什么。我在饼图中“爆炸”了一个切片,所以如果我将matched_index设置为0或其他东西,它会“爆炸”饼图中的错误切片。也许我需要更多 if/else 语句?
  • 如果你有一个先决条件是这个值被设置为特定的东西,那么把它放在循环中可能是更好的选择。这样,当根本原因是您的循环条件无效时,您就不会追逐变量。
  • 这就是解决方案,doh!
  • @Robert 不过,这听起来像是一个不同的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-09
  • 2017-10-13
  • 1970-01-01
  • 1970-01-01
  • 2021-12-19
  • 2021-11-13
  • 1970-01-01
相关资源
最近更新 更多