在Python中,局部变量可能在赋值之前被引用

在Python中,局部变量可能在赋值之前被引用,python,Python,我正在学习一些实现决策树学习器的代码。 代码如下: def calculate_entropy(self, tags): tags_counter = Counter() if len(tags) > 0: for tag in tags: tags_counter[tag] += 1 classes_probs = [float(tags_counter[tag]) / len(tags) for tag

我正在学习一些实现决策树学习器的代码。 代码如下:

def calculate_entropy(self, tags):

    tags_counter = Counter()

    if len(tags) > 0:
        for tag in tags:
            tags_counter[tag] += 1
            classes_probs = [float(tags_counter[tag]) / len(tags) for tag in tags_counter]

        entropy = 0
        for prob in classes_probs:
            if prob == 0:
                return 0
            entropy -= prob * math.log(prob, 2)

        return entropy

    else:
        return 0
我的问题是:

  • 对于类_probs,我得到一个局部变量可能在赋值消息之前被引用,我不知道为什么
  • 放置在类probs中右侧的代码是做什么的?我没见过这样的东西
  • (1) 警告是因为
    classes\u probs
    此时可能未定义。如果
    tags
    为空,则不执行第一个循环。您可以通过在第一个循环之前分配一个空列表来“修复”此问题


    (2) 这称为
    列表理解
    。使用该搜索词,在您喜欢的写作水平和示例中查找教程。

    您没有包含所有内容来重现您面临的问题。编辑文章,包括你面临的错误、输入值和预期输出。对于第二个问题,这是一个列表理解。顺便说一句,我们通常需要一个答案。当我投票结束这个问题时,我无意中发现了你的问题点。你能告诉我在这种情况下,与列表理解相当的“常规”是什么吗?再说一遍,“使用那个搜索词”。堆栈溢出不是用来取代现有的教程和个人研究。我很抱歉:-)
    [float(tags\u counter[tag])/len(tags)for tags in tags\u counter]
    可以“定期”编写为:
    l=[]
    for tags in tags\u counter:
    l.append(float(tags\u counter[tag])/len(tags))