Python 列表未附加到函数中
Python List not getting appended in fuction
由于变量的值在函数内部不会改变,我首先 运行 一个列表测试器。事实证明,它们确实附加了函数中提供的新值。这是我试过的
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()
卡片是为第一个 class 创建的,但对于下一个 class,输出相同。为什么会这样?
预期产出与实际产出
(假设 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
你所有的问题是你让所有学生都在一个单一的名单上
students = [name1, name2, name3, ...]
所以稍后它会导致第二个 class.
的正确数据出现问题
您使用索引 [0]
、[1]
等来获取第二名 class 的学生,但它需要
[class_1_strength + 0], [class_1_strength + 1], etc.
要让第三名的学生 class 你需要
[class_1_strength + class_2_strength + 0], [class_1_strength + class_2_strength + 1], etc.
所以这是个大问题。
如果您将每个 class 保留为子列表
,将会简单得多
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.
]
最简单的工作示例。
我使用 random
、string
只是为了创建一些测试数据 - 所以我不必使用 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
由于变量的值在函数内部不会改变,我首先 运行 一个列表测试器。事实证明,它们确实附加了函数中提供的新值。这是我试过的
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()
卡片是为第一个 class 创建的,但对于下一个 class,输出相同。为什么会这样?
预期产出与实际产出
(假设 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
你所有的问题是你让所有学生都在一个单一的名单上
students = [name1, name2, name3, ...]
所以稍后它会导致第二个 class.
的正确数据出现问题您使用索引 [0]
、[1]
等来获取第二名 class 的学生,但它需要
[class_1_strength + 0], [class_1_strength + 1], etc.
要让第三名的学生 class 你需要
[class_1_strength + class_2_strength + 0], [class_1_strength + class_2_strength + 1], etc.
所以这是个大问题。
如果您将每个 class 保留为子列表
,将会简单得多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.
]
最简单的工作示例。
我使用 random
、string
只是为了创建一些测试数据 - 所以我不必使用 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