通过从旧列表中复制来创建新列表

时间:2016-03-07 01:54:45

标签: python list global local sublist

这是我在这里发表的第一篇文章,如果我不清楚,请原谅。我事先搜索过这个问题,但并不确切地知道用什么词来表达它。这段代码最初是一个更大的程序的一部分,但我试图删除所有其他变量,我的问题仍然存在:

我想要做的是创建一个功能,将数字列表分类为7个数字的子列表。 “播放器”列表中的每个项目必须有一个子列表,这就是为什么我只是复制播放器列表并运行for循环以将每个元素(以前是播放器的名称)替换为相应的七个数字。应该存在的集合数量来自“玩家”列表,而数字本身则来自“播放器修改器”列表,这两个列表都在程序的其他位置定义。

players=['Paul', 'Darren']
playermodifiers=[4,5,7,2,8,4,7,3,9,4,6,2,6,4]
def modifiersort():
    n=1
    global playermodifierssort
    global playermodifiers
    playermodifierssort=players
    for x in playermodifierssort:
        playermodifierssort[n-1]=playermodifiers[7*(n-1):7*n]
        n=n+1
    playermodifiers=playermodifierssort

这会按照我的要求对列表进行排序,但是,它也会以某种方式将原始的“玩家”列表更改为与函数末尾的playermodifierssort和playermodifiers相同。当我运行该功能时,我得到:

playermodifiers = [[4, 5, 7, 2, 8, 4, 7], [3, 9, 4, 6, 2, 6, 4]]
players = [[4, 5, 7, 2, 8, 4, 7], [3, 9, 4, 6, 2, 6, 4]]

这是有问题的,因为我想保留球员名单。怎么会发生这种情况? “玩家”列表不是全局的,那么如何通过此功能永久更改?

2 个答案:

答案 0 :(得分:2)

你的行

playermodifierssort=players

未将players的值复制到playermodifierssort;它只是让playermodifierssort引用players。因此,playermodifierssort的任何更改也会更改players。将该行替换为:

playermodifierssort=players[:]

复制列表的值,你会没事的。

附录:有关列表复制(参考与价值),请参阅this article。此外,您还需要修复playermodifiers=playermodifierssort行,因为它有同样的问题。它不是复制值 - 只是简单地playermodifiers引用playermodifierssort

Another question可能对您有用。

答案 1 :(得分:0)

该行:

playermodifierssort=players

将名为playermodifierssort的变量绑定到players列表。现在,可以通过playersplayermodifierssort访问该列表。通过任一变量对列表所做的任何更改都将反映在两个变量中,因为它是一个列表。

但我认为你的做法是错误的。首先,在调用players时,您的全局modifiersort()列表会被删除。你可以在不使用globals

的情况下重写这样的内容
def modifiersort(players, playermodifiers):
    modifiers = []
    for n in range(len(players)):
        modifiers.append(playermodifiers[7*n:7*(n+1)])
    playermodifiers[:] = modifiers

函数的最后一行使用playermodifiers列表的就地替换而不依赖于全局变量。使用功能:

>>> players=['Paul', 'Darren']
>>> playermodifiers=[4,5,7,2,8,4,7,3,9,4,6,2,6,4]
>>> modifiersort(players, playermodifiers)
>>> players
['Paul', 'Darren']
>>> playermodifiers
[[4, 5, 7, 2, 8, 4, 7], [3, 9, 4, 6, 2, 6, 4]]

这可以通过列表理解来简化:

def modifiersort(players, playermodifiers):
    playermodifiers[:] = [playermodifiers[7*n:7*(n+1)] for n in range(len(players))]

>>> modifiersort(players, playermodifiers)
>>> players
['Paul', 'Darren']
>>> playermodifiers
[[4, 5, 7, 2, 8, 4, 7], [3, 9, 4, 6, 2, 6, 4]]

并且,如果您需要从多个位置进行排序,它确实提高了代码可读性,但不需要该功能:

>>> players=['Paul', 'Darren']
>>> playermodifiers=[4,5,7,2,8,4,7,3,9,4,6,2,6,4]
>>> playermodifiers = [playermodifiers[7*n:7*(n+1)] for n in range(len(players))]
>>> players
['Paul', 'Darren']
>>> playermodifiers
[[4, 5, 7, 2, 8, 4, 7], [3, 9, 4, 6, 2, 6, 4]]