2016-03-07 62 views
2

這是我第一次在這裏發表,所以請原諒我,如果我不說清楚。我之前曾經搜索過這個問題,但並不確切知道用​​什麼術語來描述它。這段代碼原本是一個較大程序的一部分,但我嘗試刪除所有其他變量,但我的問題仍然存在:通過從舊名單複製創建新的列表

什麼我希望這樣做是創建一個函數,將數字列表分爲7個子列表。每個玩家列表中必須有一個子列表,這就是爲什麼我只是複製玩家列表並運行一個for循環來替換每個元素(以前是玩家的名字)和相應的七個數字。其中的集合數量應該從'player'列表中抽取,而這些數字本身是從'playermodifier'列表中抽取的,這兩個列表都是在程序中的其他地方定義的。

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

你行

playermodifierssort=players 

是不是抄襲的players值放入playermodifierssort;它只是使playermodifierssort參考players。因此,對playermodifierssort的任何更改也將更改爲players。將該行替換爲:

playermodifierssort=players[:] 

複製列表的值,你會沒事的。


附錄:有關列表複製,請參見this article(參考值與值)。此外,您還需要修復您的playermodifiers=playermodifierssort行,因爲它有相同的問題。它不是複製值 - 它只是使playermodifiers參考playermodifierssort

Another question這可能對您有用。

+0

非常感謝。問題解決了,但我必須承認,即使沒有被標記爲全局性,我仍然對於「參與者」如何在功能之外進行改變仍然感到困惑。 – Paul

+0

@Paul:你說得對,如果你在'modifiersort'函數中使用'players =「foo」',那麼全局'players'不會被改變。然而,你的'playermodifierssort = players'這一行創建了一個對'players'的引用 - 那個時候唯一存在的'players'是全局的。所以,一旦你創建了這個引用,改變'playermodifierssort'就會改變'player'。 –

0

行:

playermodifierssort=players 

結合命名playermodifierssortplayers列表中的變量。現在可以通過players以及playermodifierssort訪問該列表。通過任一變量對列表所做的任何更改都會反映在兩個變量中,因爲它是一個列表。

但我認爲你會以錯誤的方式去做這件事。一方面,當調用modifiersort()時,您的全局players列表將被丟棄。你可以重寫這樣無需使用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]] 
相關問題