Skip to main content
 首页 » 编程设计

python之项目没有 append 到列表,或者列表在 python 中返回为空

2025年05月04日28Free-Thinker

在我的代码中,项目 percentgrade 没有在 for 循环的每次迭代中 append 到列表 lnpercentgrade,但我不确定为什么。当我尝试对 lnpercentgrade 中的项目求和时(在代码末尾),我返回 0,因为 lnpercentgrade 是空的。 我将 lnpercentgrades 声明为 maininput() 函数之外的全局变量,否则在代码底部当我尝试求和(lnpercentgrades)时,返回“lnpercentgrades not defined”。

我猜 lnpercentgrades 没有在 maininput() 函数中以某种方式被修改,即使我确信我在 .append 函数之前输入它是正确的。

我真正想做的是将 sum(lnpercentgrades) 与 100 相匹配,但是当我输入 5 个值为 20 的项目时,总和为 0 而不是 100。

重要的行用箭头标记<<<<<<<<<<<<<<<<<<<<

lnpercentgrades = []   <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
def maininput(): 
    numtests = int(input("Enter # of tests:")) 
    numassign = int(input("Enter # of assignments:")) 
    numquizzes = int(input("Enter # of quizzes:")) 
    numlabs = int(input("Enter # of labs:")) 
 
    l = [numtests, numassign, numquizzes, numlabs] 
    ln = ["test", "assignments", "quizzes", "labs"] 
    lnpercentgrades = [] <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    testwavg = None 
    numassignwavg = None 
    numquizzeswavg = None 
    numlabswavg = None 
    numfinalwavg = None 
 
    lnwavg = [testwavg, numassignwavg, numquizzeswavg, numlabswavg] 
    print(l[0]) 
    print("Is there a separately weighted final?") 
    yn = int(input("Enter 1 for yes. 2 for no:")) 
    while (yn > 2 or yn < 1): 
        yn = int(input("Enter 1 for yes. 2 for no, please:")) 
 
    n = 4  
    if yn == 1: 
        final = 1 
        l.append(final) 
        ln.append("final") 
        lnwavg.append(numfinalwavg) 
        n = 5 
 
 
    for i in range (n): 
        if l[i] > 0: 
            print("Enter % of total grade of",ln[i],":")  
            percentgrade = float(input(""))  
            print("you inputed:", percentgrade) 
            lnpercentgrades.append(percentgrade) <<<<<<<<<<<<<<<<<<<<<< 
            percentgrade = percentgrade*.01  
 
 
            varscoreslist = [] 
            for x in range(l[i]): 
                print("Enter score of", ln[i], x+1,"as a fraction:") 
                from fractions import Fraction 
                inputfrac = input("") 
                varscore = float(sum(Fraction(s) for s in inputfrac.split()))  
                #the above converts fractional inputs to decimals 
                varscoreslist.append(varscore) 
 
            if ln[i] == "labs": 
                score = sum(varscoreslist) 
            else: 
                sumscores = sum(varscoreslist) 
                score = sumscores/l[i] 
 
            lnwavg[i] = score*percentgrade 
 
maininput() 
print(lnpercentgrades) 
print("sum of percent of grades", sum(lnpercentgrades)) <<<<<<<<<<<<<<< 
 
if float(sum(lnpercentgrades)) != 100:  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    print("Sorry, the grade percent of each item enter did not sum to 100:") 
    print("Program will rerun.") 
    input("") 
    maininput() 
 
coursegrade = sum(lnwavg) 
print("Your course grade is:", coursegrade) 
 
input("") 

请您参考如下方法:

乍一看,您似乎遇到了范围界定问题。您正在函数内部修改列表,但请记住这是列表的本地副本。尽管您是在外部范围内声明它,但您并没有在它前面加上 global,这意味着它会创建一个函数本地副本,执行其业务然后退出,而不会影响“main” ' 列表。

我建议修改您的函数以返回您想要的列表,以便您可以按预期使用它们。这是一个基本示例:

def MyFunc(): 
    l1 = ['my', 'first', 'list'] 
    l2 = ['another', 'list'] 
    return l1, l2 
 
main_list, second_list = MyFunc() 
 
print(main_list) 
print(second_list) 

输出:

['my', 'first', 'list'] 
['another', 'list'] 

如果您真的想将变量保留在外部作用域中,则必须在函数内部以 global 开头(不过我可能会使用第一种方法):

main_list = [] 
second_list = [] 
 
def MyFunc(): 
    global main_list 
    global second_list 
    main_list = ['more', 'good', 'stuff'] 
    second_list = ['another', 'list'] 
 
 
MyFunc() 
 
print(main_list) # ['more', 'good', 'stuff'] 
print(second_list) # ['another', 'list']