python-for遍历,封装成函数调用就失效了,为什么

甜芯玉米 2020-03-26 11:56:54
import random
teacher_list=['老师1', '老师2', '老师3', '老师4', '老师5']
class_list=[[], [], []]

#取出列表的每个元素,添加到 class_list 列表中的随机位置
def allot():
for i in teacher_list:
class_num = random.randint(0,2)
class_list[class_num].append(i)
print(class_list)

allot()


运行结果:
[['老师1', '老师2', '老师4'], ['老师3'], ['老师5']]

这是我想要的,然后我想把teacher_list和class_list 都用函数封装起来,结果发现,for遍历就失效了。请看代码:
import random
# 创建函数1,生成teacher_list列表
def create_teacher():
teacher_list = []
i = 1
while i <= 5:
teacher_list.append('老师' + str(i))
i += 1
return teacher_list

# 创建函数2,生成class_list 列表
def create_class():
class_list = []
add_list = []
i=1
while i <= 3:
class_list.append(add_list)
i +=1
return class_list

#创建函数3,分配功能 allot
def allot():
for i in teacher_list:
class_num = random.randint(0,3-1)
class_list[class_num].append(i)
print(class_list)

#程序开始执行
teacher_list = create_teacher()
class_list=create_class()
print(teacher_list) #测试teacher_list打印结果
print(class_list) #测试class_list 打印结果
print('-------分界线--------')
allot()


运行结果:
['老师1', '老师2', '老师3', '老师4', '老师5']
[[], [], []]
-------分界线--------
[['老师1', '老师2', '老师3', '老师4', '老师5'], ['老师1', '老师2', '老师3', '老师4', '老师5'], ['老师1', '老师2', '老师3', '老师4', '老师5']]

Process finished with exit code 0



为啥我封装成函数,就结果有差了呢,明明测试teacher_list和class_list 都是对的。但是输出结果,居然是把整个teacher_list 放入到空列表中,我要的是teacher_list的每个元素。
问题:请问我后面的代码哪里错 了呢,为啥for 遍历不生效了?

...全文
420 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_45903952 2020-03-26
  • 打赏
  • 举报
回复
list1=[[] for _ in range(4)] list1[0].append(3) print(list1) 或者这个创建和修改
weixin_45903952 2020-03-26
  • 打赏
  • 举报
回复
浅拷贝的事,allot()进去后,class(class_num)都变成一样了
paullbm 2020-03-26
  • 打赏
  • 举报
回复
这个涉及到list的浅拷贝的知识了!

把你的

def create_class():
class_list = []
add_list = []
i=1
while i <= 3:
class_list.append(add_list)
i +=1
return class_list

改成:

def create_class():
class_list = []
#add_list = []
i=1
while i <= 3:
class_list.append([])
i +=1
return class_list


就行了!

解释说明:
修改前和修改后似乎变化不大,但这涉及到一个问题:
你的add_list = [] 定义为了一个空的列表,但在内存中指向的是同一个地址!
然后你在循环体中都append了指向同一个内存地址的空列表,所以就具备了浅拷贝的条件!
而在循环体中直接append了一个临时的空列表,并且没有变量指向,所以就不具备浅拷贝的条件!

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧