【问题标题】:Python List not getting appended in fuctionPython列表未附加在函数中
【发布时间】:2022-01-13 14:52:23
【问题描述】:

由于变量的值不会在函数内部更改,因此我首先运行了一个列表测试器。事实证明,它们确实附加了函数中提供的新值。这是我尝试过的


def test():
    testlist.append(6)


testlist=[3,4]

print(testlist)

test()

print(testlist)


输出:-

[3, 4]

[3, 4, 6]

但是当我在我的实际项目中尝试这个时,它不起作用。 以下是部分代码:-

student_name=[]
roll_number=[]

def student_info()
            
            sn=input("Student Name : ")
            student_name.append(sn)

            rn=input("Roll no. : ")
            roll_number.append(rn)


student_info() 运行次数与有多少学生一样多,这也是一个变量。

每次,列表都会为每个学生附加一个值。稍后将在需要时使用索引号提取所有这些值。但是当我尝试调用列表值时,它始终是列表的第一个值。所以列表没有被追加?


def print_card():
        for p in range(0,no_of_classes,1):
            for l in range(0,class_strength,1):
           
                print("Student Name:",student_name[l],x*50,"Roll No:",roll_number[l])
                
                

(请忽略不必要的复杂格式部分)


#This is the main part of the code.

for j in range (no_of_classes):
    
    class_=input("Class name")
    print("Class strength of ",class_)
    class_strength=int(input())
    
    for i in range (class_strength):
        student_info()
print_card()

这是最小的可重现程序


student_name=[]
roll_number=[]

def student_info():
            
            sn=input("Student Name : ")
            student_name.append(sn)

            rn=input("Roll no. : ")
            roll_number.append(rn)
            
def print_card():
        for p in range(0,no_of_classes,1):
            for l in range(0,class_strength,1):
                x=' '
                print('\n')
                print("Student Name:",student_name[l],x*50,"Roll No:",roll_number[l])

no_of_classes=2
class_strength=1

for j in range (0,no_of_classes):
    
    for i in range (0,class_strength):
        student_info()
        
        
print_card()

卡片是为第一堂课创建的,但对于下一堂课,会出现相同的输出。为什么会这样?

预期输出与实际输出

(比如 2 名学生)

                                      kode skool                                     
Student Name: 1                                                    Roll No: 1
Class: 1                                                           Section: 1
Address    1
           1


City:  1                                                        Pin Code: 1
Guardian's Phone Number 1


                                      kode skool                                        
Student Name: 2                                                    Roll No: 2
Class: 2                                                           Section: 2
Address    2
           2


City: 2                                                     Pin Code: 2
Guardian's Phone Number 2



-------------------------------------------------------------------



                                      kode skool  
Student Name: 1                                                    Roll No: 1
Class: 1                                                           Section: 1
Address    1
           1


City:  1                                                        Pin Code: 1
Guardian's Phone Number 1





                                      kode skool  
Student Name: 1                                                    Roll No: 1
Class: 1                                                           Section: 1
Address    1
           1


City:  1                                                        Pin Code: 1
Guardian's Phone Number 1




【问题讨论】:

  • when I try to call a list value it's always the first index value that comes 不清楚。老实说,我根本无法对它做出正面或反面。请显示示例输出与您期望的输出。另外,您的示例不是minimal reproducible example,因为您还没有定义inew_lineno_of_classesclass_strength,并且您说ignore unnecessarily complex formatting part 这表明您可以删除它并且仍然有这是问题的一个例子。
  • 抱歉让问题变得如此含糊。第一个索引值是指列表的第一个值。
  • 好的,很酷,当你处理完我提到的其他事情时告诉我,以便我尝试帮助你。
  • 它是 for 循环的一部分,我用它来让 student_info() 运行几次。 [ for i in range (1,class_strength) ] 是准确的行
  • 请提供minimal reproducible example;不需要完整的输出来证明列表是否正在更新。函数 student_info 看起来不错,但您没有显示 调用 函数的方式或位置,也没有显示 range 中使用的值如何(或是否)与您想要的两个列表相关更新。

标签: python list function append


【解决方案1】:

你所有的问题是你把所有学生都放在一个单一的名单上

students = [name1, name2, name3, ...] 

所以以后获取第二类的正确数据会出现问题。

您使用索引[0][1] 等来获取二等学生,但这需要

[class_1_strength + 0], [class_1_strength + 1], etc.

要让第三班的学生,你需要

[class_1_strength + class_2_strength + 0], [class_1_strength + class_2_strength + 1], etc.

所以问题很大。

如果你将每个类都保留为子列表会简单得多

school = [
    [name1, name2, name3, ...], # class 1
    [name1, name2, name3, ...], # class 2
    # etc.
]

或作为字典:

school = {
    'class_1_name': [name1, name2, name3, ...], # class 1
    'class_2_name': [name1, name2, name3, ...], # class 2
    # etc.
}

坦率地说,将所有价值观放在一起会很好:

school = [
    [ (name1, roll_number, ...),  (name2, roll_number, ...), ...], # class 1
    [ (name1, roll_number, ...),  (name2, roll_number, ...), ...], # class 2
    # etc.
]

最小的工作示例。

我使用randomstring 只是为了创建一些测试数据——所以我不必使用input()

我使用random.seed(0) 获取始终相同的数据 - 因此我可以将它们与之前的执行进行比较。

import random
import string

random.seed(0)

def generate_random_name(lenght=5):
    return "".join(random.choices(string.ascii_uppercase, k=lenght))

def get_student_info():
    
    #student_name = input("Student Name : ")
    #roll_number  = input("Roll no. : ")

    student_name = generate_random_name()
    roll_number  = 1

    return student_name, roll_number
    
def print_card():
    for class_number, class_students in enumerate(school, 1):
        print('--- class:', class_number, '---\n')
        for item in class_students:
            student_name, roll_number, class_number = item

            print(f"Student Name: {student_name:}")
            print(f"Roll No: {roll_number}")
            print(f"Class: {class_number}")
            print()
        
# --- main ---

school = []

no_of_classes = 2
class_strength = 3

for class_number in range(1, no_of_classes+1):

    class_students = [] # list for all students in one clas

    for student_number in range(1, class_strength+1):

        student_name, roll_number = get_student_info()

        # all information about one student        
        item = [student_name, student_number, class_number]

        class_students.append(item)

    school.append(class_students)
        
print_card()

结果:

--- class: 1 ---

Student Name: VTKGN
Roll No: 1
Class: 1

Student Name: KUHMP
Roll No: 2
Class: 1

Student Name: XNHTQ
Roll No: 3
Class: 1

--- class: 2 ---

Student Name: GXZVX
Roll No: 1
Class: 2

Student Name: ISXRM
Roll No: 2
Class: 2

Student Name: CLPXZ
Roll No: 3
Class: 2

【讨论】:

    猜你喜欢
    • 2021-12-03
    • 1970-01-01
    • 2021-01-28
    • 1970-01-01
    • 1970-01-01
    • 2016-07-14
    • 2013-12-30
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多