为什么会收到“函数中未使用局部变量”的警告?

时间:2018-10-19 18:48:09

标签: python variables pycharm local

我是编程的新手,自从这学期开始以来,我才第一次遇到减速。我们一直在使用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

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

6 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

我还可以用通俗易懂的方式告诉您一些有关全局变量和局部变量的信息:您在函数内部定义的任何变量(例如“ rank”)都不会在函数外部存在。如果运行上述命令,然后尝试在函数外部调用“ rank”,则将调用一个空白变量(除非您专门将另一个变量命名为“ rank”)。这使您可以在函数内部使用等级,而不必担心与函数外部的变量发生冲突。通常,您要避免制作任何真正的“全局”变量,但是在函数外部命名的变量比在内部命名的变量更“全局”。

对于pyCharm所标记的内容,我不确定,因为我不使用该程序。您在任何地方调用函数吗?可能是让您知道正在定义函数,然后不调用它。

答案 2 :(得分:0)

通过阅读代码,我了解到此函数返回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

答案 3 :(得分:0)

从所编写的代码的角度来看,等级是已定义但未使用的-您将其设置并中断,因此看起来好像什么也没做。再一次,就是其他人提到的缩进。

答案 4 :(得分:0)

非常感谢大家的快速实用的回复!我的缩进不正确,愚蠢的错误。老实说,我不知道我有多少次忽略了它。

我也感谢局部变量的区别。我认为我以前的理解还不错,但是我得到的pycharm说明让我陷入了循环。

答案 5 :(得分:0)

可能最短的时间是

@Html.Action("Index","Filter");

结果:

select
    g.Form15, g.Form30, g.Form60, g.GaugeDate,
    r15.RateDate as RateDate_15, r15.Rate as Rate_15,
    r30.RateDate as RateDate_30, r30.Rate as Rate_30,
    r60.RateDate as RateDate_60, r60.Rate as Rate_60
  from GaugeCompare g
  left join DailyInterestRates r15 on r15.RateDate = g.GaugeDate - interval 15 day
  left join DailyInterestRates r30 on r30.RateDate = g.GaugeDate - interval 30 day
  left join DailyInterestRates r60 on r60.RateDate = g.GaugeDate - interval 60 day