【问题标题】:items not appending to list, or list returning as empty in python?项目未附加到列表,或列表在 python 中返回为空?
【发布时间】:2012-11-08 01:53:15
【问题描述】:

在我的代码中,percentgrade 项在 for 循环的每次迭代中都没有附加到列表 lnpercentgrade,但我不知道为什么。当我尝试对 lnpercentgrade 中的项目求和时(在代码末尾),我返回 0,因为 lnpercentgrade 是 empy。 我将 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("")

【问题讨论】:

  • 为什么不把它作为函数结果返回——那你就不需要在函数之前指定它
  • RocketDonkey 已经做了所有你需要的解释

标签: python list append


【解决方案1】:

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

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

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']

【讨论】:

  • 嗯... In 和 Out 有什么作用?
  • @ShaltNot 对不起,这可能比它需要的更令人困惑 - 那是使用 IPython 解释器。我将替换为您将放入模块中的内容。
  • 好的,不过我很感谢您的帮助。如果您愿意,您仍然可以保留此当前代码,并添加其他版本。不过我打算试试全局变量。
  • @ShaltNot -- 对不起,global 在火箭原始示例中提供的第一个示例中不需要。他的更新使该评论大部分已过时。我会删除。附带说明一下,lnpercentgrades[:] = [] 也可以。
  • @ShaltNot -- 这是一个切片分配。基本上,它会删除列表中的所有内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-05
  • 2021-12-03
  • 2013-03-08
  • 1970-01-01
  • 2013-08-07
相关资源
最近更新 更多