2016-05-20 18 views
0

にリストを変更します次の機能を使ってカードを選んでデッキから取り出します。Pythonの:</p> <p>私は大きなリストにカードを持っている、と私:私は私のプログラミングのスキルを少し改善するために、カードゲームのシミュレーションを作成しようとしています、と私は、次のような問題で立ち往生していますのためにループ

cards= [........(big list of cards here in string format).......] 
def Pickacard(x): 
    rand=random.randint(0,len(x)-1) 
    t=int(x[rand]) 
    del(x[rand]) 
    return t 

次の繰り返しを使用すると、デッキは更新されません。代わりに、カードがピックされるたびに、すべてのループで「テスト=カード」を設定して、リストを元のものに戻すように設定しても、デッキは1アイテム短くなります。

for i in range(200): 
    test=cards 
    Pickacard(test) 
    print(test) 

デッキには208枚のカードがあり、デッキが更新された場合、(印刷テスト)207枚のカードのリストが表示されます。代わりに私は8枚のカードのリストを得る。私はこれが起こるのは....テスト=カード....ループの外にあった場合だけです。

+1

リストをコピーリストをコピーしてくださいする方法の詳細を見ることができます。例えば'test = list(cards)'です。あなたは現在、同じリストへの参照を渡しています。あなたがそれから削除するとき。この変更は、そのリストを参照するすべてのインスタンスで表示されます。 –

答えて

1

リストのデータではなく参照をコピーしています。次のオプションを試してください。

import copy 
test = copy.copy(cards) 

OR

test = list(cards) 

また、あなたがtestにリストcardsをコピーされていないtest = cardsを呼び出す場合についてDeep and Shallow Copy

2

をお読みください。実際には、ポインタtestcardsにコピーするだけです。彼らは同じリストを指しています。これはリストが縮小し続け、更新されない理由です。

更新する場合は、いくつかの可能性があります。あなたは、次のとリストのコピーを作成できます。test = cards[:]

  • スライス、それを(ないことを行うための最善の方法)
  • list()でそれを作成します:test = list(copy)
  • 明示的なコピーを:test = copy.copy(cards)(インポートする必要がありますモジュールcopy最初)

これ以外の場合、削除したカードを保存してループの最後に挿入することができます。これにより、各反復でリストをコピーすることが回避されます。それはあなたのケースでは非常に重要ではないのですが、それは不必要なコンピューティングを回避することにより、パフォーマンスについて少し考えるのは良い習慣です:

Pythonで
def Pickacard(x): 
    rand=random.randint(0,len(x)-1) 
    card = x[rand] 
    del(x[rand]) 
    return card 

for i in range(200): 
    card = Pickacard(cards) 
    print(cards) 
    cards.append(card) 
1

は、変数がオブジェクトの単なる別名です。あなたのプログラムでは、testcardsは同じオブジェクトの2つのエイリアスです。したがって、cardsの項目を削除すると、testも変更されます。

あなたはtestが別のオブジェクトになりたい場合は、これは、カードのすべてのアイテムを含む新しいリストを構築します

test = cards[:] 

を使用することができます。

あなたがここに How to clone or copy a list in Python?

関連する問題

 関連する問題