如何在Python函数中永久将外部列表替换为分组后的新列表
问题原因与修复方案
问题根源
Python的参数传递为对象引用传递,你在函数内部对players执行players = []、players = players_team这类赋值操作时,只是修改了函数内部的局部变量players的指向,没有修改外部传入的原始列表对象本身,因此外部的players列表不会发生变化。
修复方法
方案1:修改原列表对象(无需调整调用逻辑)
直接操作原始列表的内容而非给局部变量重新赋值,将函数最后一行的players = players_team替换为players[:] = players_team,或者先清空原列表再追加分组结果即可。
修改后完整代码:
def group_together(players, team): coplayers = list(players) players.clear() players_team = [] num_players= len(coplayers) no_groups = num_players // team if num_players%team > 0: no_groups += 1 c = 0 for i in range(no_groups): players_team.append([]) for j in range(team): if c < num_players: players_team[i].append(coplayers[c]) c+=1 players.extend(players_team) players = [456, 218, 67, 1, 101, 199] group_together(players, 2)#无返回值 print(players)
方案2:函数返回结果后外部赋值(更推荐的写法)
让函数返回分组后的嵌套列表,调用时直接将返回值赋值给外部players变量,这种写法无隐式副作用,可读性更强。
修改后完整代码:
def group_together(players, team): coplayers = list(players) players_team = [] num_players= len(coplayers) no_groups = num_players // team if num_players%team > 0: no_groups += 1 c = 0 for i in range(no_groups): players_team.append([]) for j in range(team): if c < num_players: players_team[i].append(coplayers[c]) c+=1 return players_team players = [456, 218, 67, 1, 101, 199] players = group_together(players, 2) print(players)
两种方案运行后都可以得到预期输出[[456, 218], [67, 1], [101, 199]]。
内容的提问来源于stack exchange,提问作者Yergia
相关产品推荐
相关产品推荐

