修复Python中的 UnboundLocalError: 局部变量在赋值前被引用

318 阅读2分钟

在Python中,当尝试使用一个未赋值的局部变量时,会引发UnboundLocalError错误。

  • 这个错误通常是由于在使用变量之前没有正确地对其赋值造成的。
  1. 解决方案

    1. 确保在使用变量之前对其进行赋值。
    2. 如果要使用一个尚未存在于当前作用域的变量,可以先对其进行声明,然后再赋值。
    3. 避免在函数内部使用未声明的变量。
  2. 代码示例:

# 代码段1:错误示例

def descriptionGenerator(descriptionVariables):
    descriptionVariableSize = len(descriptionVariables)
    if descriptionVariables[0] == 'char':
        # 如果只有一个变量('char'),创建一个随机描述
        if descriptionVariableSize == 1:
            # 定义 descriptionVariables 的选择范围
            gender_choices = ['male', 'female']
            hair_choices = ['black', 'red', 'blonde', 'grey', 'brown', 'blue']
            hair_choices2 = ['long', 'short', 'cropped', 'curly']
            size_choices = ['tubby', 'thin', 'fat', 'almost twig-like']
            demeanour_choices = ['glowering', 'bright', 'smiling', 'sombre', 'intelligent']
            impression_choices = ['likeable', 'unlikeable', 'dangerous', 'annoying', 'afraid']
            # 定义描述变量
            gender = random.choice(gender_choices)
            height = str(float('0.' + str(random.randint(1, 9))) + float(random.randint(1, 2)))
            if float(height) > 1.8:
                height_string = 'tall'
                if float(height) > 2:
                    height_string = 'very tall'
            elif float(height) < 1.8 and float(height) > 1.5:
                height_string = 'average'
            elif float(height) < 1.5:
                height_string = 'short'
                if float(height) < 1.3:
                    height_string = 'very short'
            hair = random.choice(hair_choices2) + ' ' + random.choice(hair_choices)
            size = random.choice(size_choices)
            demeanour = random.choice(demeanour_choices)
            impression = random.choice(impression_choices)
            # 收集描述变量到列表 'randomDescriptionVariables' 中
            randomDescriptionVariables = ['char', gender, height, height_string, hair, size, demeanour, impression]
            # 使用 'descriptionGenerator' 函数生成描述
            descriptionGenerator(randomDescriptionVariables)

# 代码段2:修复后的代码

def descriptionGenerator(descriptionVariables):
    descriptionVariableSize = len(descriptionVariables)
    if descriptionVariables[0] == 'char':
        # 如果只有一个变量('char'),创建一个随机描述
        if descriptionVariableSize == 1:
            # 定义 descriptionVariables 的选择范围
            gender_choices = ['male', 'female']
            hair_choices = ['black', 'red', 'blonde', 'grey', 'brown', 'blue']
            hair_choices2 = ['long', 'short', 'cropped', 'curly']
            size_choices = ['tubby', 'thin', 'fat', 'almost twig-like']
            demeanour_choices = ['glowering', 'bright', 'smiling', 'sombre', 'intelligent']
            impression_choices = ['likeable', 'unlikeable', 'dangerous', 'annoying', 'afraid']
            # 定义描述变量
            gender = random.choice(gender_choices)
            height = str(float('0.' + str(random.randint(1, 9))) + float(random.randint(1, 2)))
            # 使用 >= 和 <= 来确保 height_string 被赋值
            if float(height) >= 1.8:
                height_string = 'tall'
                if float(height) > 2:
                    height_string = 'very tall'
            elif float(height) <= 1.8 and float(height) >= 1.5:
                height_string = 'average'
            elif float(height) < 1.5:
                height_string = 'short'
                if float(height) < 1.3:
                    height_string = 'very short'
            hair = random.choice(hair_choices2) + ' ' + random.choice(hair_choices)
            size = random.choice(size_choices)
            demeanour = random.choice(demeanour_choices)
            impression = random.choice(impression_choices)
            # 收集描述变量到列表 'randomDescriptionVariables' 中
            randomDescriptionVariables = ['char', gender, height, height_string, hair, size, demeanour, impression]
            # 使用 'descriptionGenerator' 函数生成描述
            return descriptionGenerator(randomDescriptionVariables)

# 代码段3:调用函数获取描述

myDescriptionVariables = ['char']
myOutput = descriptionGenerator(myDescriptionVariables)
print(myOutput)

通过这些修改,我们确保了在使用height_string变量之前对其进行了赋值,从而修复了UnboundLocalError错误。现在,程序可以正确地生成随机描述。