这是我在这里发表的第一篇文章,如果我不清楚,请原谅。我事先搜索过这个问题,但并不确切地知道用什么词来表达它。这段代码最初是一个更大的程序的一部分,但我试图删除所有其他变量,我的问题仍然存在:
我想要做的是创建一个功能,将数字列表分类为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]]
这是有问题的,因为我想保留球员名单。怎么会发生这种情况? “玩家”列表不是全局的,那么如何通过此功能永久更改?
答案 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
列表。现在,可以通过players
和playermodifierssort
访问该列表。通过任一变量对列表所做的任何更改都将反映在两个变量中,因为它是一个列表。
但我认为你的做法是错误的。首先,在调用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]]