【问题标题】:Why am I getting "Local variable unused in function" warning?为什么我会收到“函数中未使用的局部变量”警告?
【发布时间】:2018-10-19 18:48:08
【问题描述】:

我是编程新手,自本学期开始以来,我刚刚遇到了我的第一个减速带。我们一直在使用 python,我们最近的任务是改变以前的程序来使用函数。我正在了解如何使用它们以及不使用它们,但是我认为我缺乏对局部变量的一些小东西的概念理解。

我使用 pycharm 编写作业,我可以看到它指出我的一个变量未使用,我不明白为什么或如何修复它。我已经修补了几个小时,然后迷路了。

# Function "checkName" takes in 2 parameters
# The first is name, which will be given by user input
# The second is nameList, which comes from the function getNamesList
def checkName(name, nameList):
    for i in range(0, len(nameList)):
        if name == nameList[i]:
            rank = i + 1
            break
        else:
            rank = 0 ## This rank is undefined ##
        return rank

关于我做错了什么的任何指示?对定义局部变量和全局变量之间差异的解释也将不胜感激!

【问题讨论】:

  • 您的return 语句缩进太远。备份一级。
  • '我的变量之一......':哪一个?在哪里?
  • 这只是rank = nameList.index(name) + 1 if name in nameList else 0
  • 当您点击break 语句时,该函数将完成并返回None。这可能不是你想要的。我在这个函数中看不到任何未使用的局部变量。您确定警告不是由其他功能引起的吗?

标签: python variables pycharm local


【解决方案1】:

您在rank = i + 1 行上收到错误“未使用局部变量'rank' 值”,因为下一行的break 语句导致函数结束而从未从rank 读取值。只是这种情况是因为您的 return 语句缩进太远。将其移回一级缩进,这样在循环完成之前它不会返回并且警告将消失。

def checkName(name, nameList):
    for i in range(0, len(nameList)):
        if name == nameList[i]:
            rank = i + 1
            break
        else:
            rank = 0 ## This rank is undefined ##
    return rank

【讨论】:

    【解决方案2】:

    我可以告诉你,如果你点击了“break”语句,你将不会返回任何东西,因为你的缩进错误。您需要从退货中取出一个缩进。

    我还可以通俗地告诉你一些关于全局变量和局部变量的信息:你在函数内部定义的任何变量,例如“rank”,都不会在函数外部持续存在。如果你运行上面的代码然后尝试在你的函数之外调用'rank',你将调用一个空白变量(除非你专门命名了另一个变量'rank')。这使您可以在函数内部使用排名,而不必担心与函数外部的变量发生冲突。通常,您希望避免创建任何真正的“全局”变量,但在函数外部命名的变量比在函数内部命名的变量更“全局”。

    至于 pyCharm 在标记什么,我不确定,因为我不使用该程序。你在任何地方调用你的函数吗?它可能让你知道你正在定义你的函数,然后不调用它。

    【讨论】:

    • 他的问题在于他的return 语句,因为它总是在for 循环的第一次迭代中被调用,除非if 语句中的第一个条件被触发。然后您将启动 break 语句,这将完全脱离 for 循环,并且永远不会到达 return 语句。
    • 是的,我绝对同意你的看法。实际上我不清楚他想用他的程序做什么,否则我们可能会更有帮助。
    【解决方案3】:

    通过阅读您的代码,我了解到此函数返回name 在给定listnames 中的排名或索引。 return 语句的缩进错误。

    所以要改进您的代码,请检查:

    def checkName(name, nameList):
        for i in range(nameList):
            if name == nameList[i]:
                return i + 1
            # you don't need an else here, just return -1 or 0 or None ( by default )
            # whenever `name` doesn't exists on the nameList
        # not very pythonic
        return 0
    

    由于缩进错误,您的代码并不总是使用局部变量 rank

    【讨论】:

      【解决方案4】:

      从编写的代码的角度来看,排名已定义但未使用 - 你设置它并中断,所以它看起来像没有做任何事情。再一次,这是其他人提到的缩进。

      【讨论】:

        【解决方案5】:

        非常感谢大家快速而有帮助的回复!我的缩进关闭了,愚蠢的错误。老实说,我不知道我怎么忽略了这么多次。

        我也很欣赏局部变量的区别。我认为我之前的理解是好的,但是我得到的 pycharm 笔记让我陷入了循环。

        【讨论】:

          【解决方案6】:

          可能是最短的:

          nameList = ["a", "b", "c"]
          
          def checkName(name, nameList):
              return(nameList.index(name) + 1 if name in nameList else 0)
          
          for i in ["a", "b", "c", "d"]:
              print(checkName(i, nameList))
          

          结果:

          1
          2
          3
          0
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-01-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-11-29
            • 1970-01-01
            相关资源
            最近更新 更多