2017-07-28 26 views
-1

私は、リストを与えるようになる一連の関数を持っています。最初の項目には辞書を派生させた番号があり、2番目と3番目の項目は辞書です。ランダムに生成された辞書をPythonに格納する

これらの辞書は、以前にランダムに生成されています。

私が使用している関数は、指定された数のこれらの辞書を生成し、最も高い数値を最初の項目として取得しようとします。 (ダイスロールを最適化するように設計されています)。

これはすべて正常に動作し、すべての繰り返しの中で最も高い最初のアイテムの値を印刷できます。しかし、この最初の数字に関連付けられている2つの辞書を試してみると(リストにまとめられていることを念頭に置いてください)、他の2つの辞書が無作為に生成されているように見えます。

def repeat(type, times): 
    best = 0 
    for i in range(0, times): 
     x = rollForCharacter(type) 
     if x[0] > best: 
      print("BEST:", x) 
      best = x[0] 

    print("The highest average success is", best) 

    return best 

これは素晴らしいです。

BEST: (3.58, [{'strength': 4, 'intelligence': 1, 'charisma': 1, 'stamina': 4, 'willpower': 2, 'dexterity': 2, 'wits': 5, 'luck': 2}, {'agility': 1, 'brawl': 2, 'investigation': 3, 'larceny': 0, 'melee': 1, 'survival': 0, 'alchemy': 3, 'archery': 0, 'crafting': 0, 'drive': 1, 'magic': 0, 'medicine': 0, 'commercial': 0, 'esteem': 5, 'instruction': 2, 'intimidation': 2, 'persuasion': 0, 'seduction': 0}]) The highest average success is 3.58

しかし、私はこの番号を与えたリストを格納するために何かをしようとした場合::示した最後の事はある

def repeat(type, times): 
    best = 0 
    bestChar = [] 
    for i in range(0, times): 
     x = rollForCharacter(type) 
     if x[0] > best: 
      print("BEST:", x) 
      best = x[0] 
      bestChar = x 

    print("The highest average success is", best) 
    print("Therefore the best character is", bestChar) 

    return best, bestChar 

を私は結構です、最後の結果として、これを取得します

BEST: (4.15, [{'strength': 2, 'intelligence': 3, 'charisma': 4, 'stamina': 4, 'willpower': 1, 'dexterity': 2, 'wits': 4, 'luck': 1}, {'agility': 1, 'brawl': 0, 'investigation': 5, 'larceny': 0, 'melee': 0, 'survival': 0, 'alchemy': 7, 'archery': 0, 'crafting': 0, 'drive': 0, 'magic': 0, 'medicine': 0, 'commercial': 1, 'esteem': 0, 'instruction': 3, 'intimidation': 0, 'persuasion': 0, 'seduction': 0}]) The highest average success is 4.15

が、最後の行は

です

Therefore the best character is (4.15, [{'strength': 1, 'intelligence': 3, 'charisma': 4, 'stamina': 4, 'willpower': 1, 'dexterity': 2, 'wits': 2, 'luck': 3}, {'agility': 1, 'brawl': 0, 'investigation': 1, 'larceny': 4, 'melee': 2, 'survival': 0, 'alchemy': 2, 'archery': 4, 'crafting': 0, 'drive': 0, 'magic': 0, 'medicine': 0, 'commercial': 1, 'esteem': 0, 'instruction': 0, 'intimidation': 2, 'persuasion': 1, 'seduction': 0}])

ご覧のとおり、これは私が望むものと一致せず、文字通りその上に何が表示されていますか。

ちょっと調べてみると、 "ベストキャラクター"が最後に生成されたものであることがわかりました。これは最高ではなく、最近のものです。しかし、最初の要素が記録された最高の結果であり、リストの残りの文字からではないため、単純ではありません。これは、リストがどうにか編集されていることを意味するので、実際には混乱しますが、どこでそれが起こるのか分かりません。

いつもランダムに生成される何か愚かなことをしていますか?私はx[0]が正しい結果を与えて、それが全体のリストであるときに何が変わるのでうまく保存されていると思いますか?

rollForCharacter()関数からは、数字だけのrollResult, characterが返され、次に2つの辞書が返されます。

誰かが私が間違っている場所を説明し、コンソールに正しい答えを印刷することができますが、なぜそれが正しい行を下に保存しないのかを説明できると大変感謝します!

EDIT:

辞書1つのコード:

attributes = {} 


def assignRow(row, p): # p is the number of points you have to assign to each row 
    rowValues = {} 
    for i in range(0, len(row)-1): 
     val = randint(0, p) 
     rowValues[row[i]] = val + 1 
     p -= val 
    rowValues[row[-1]] = p + 1 
    return attributes.update(rowValues) 


def getPoints(): 
    points = [7, 5, 3] 
    shuffle(points) 
    row1 = ['strength', 'intelligence', 'charisma'] 
    row2 = ['stamina', 'willpower'] 
    row3 = ['dexterity', 'wits', 'luck'] 
    for i in range(0, len(points)): 
     row = eval("row" + str(i+1)) 
     assignRow(row, points[i]) 

辞書2コード:

skills = {} 


def assignRow(row, p): # p is the number of points you have to assign to each row 
    rowValues = {} 
    for i in range(0, len(row) - 1): 
     val = randint(0, p) 
     rowValues[row[i]] = val 
     p -= val 
    rowValues[row[-1]] = p 
    return skills.update(rowValues) 


def getPoints(): 
    points = [11, 7, 4] 
    shuffle(points) 
    row1 = ['agility', 'brawl', 'investigation', 'larceny', 'melee', 'survival'] 
    row2 = ['alchemy', 'archery', 'crafting', 'drive', 'magic', 'medicine'] 
    row3 = ['commercial', 'esteem', 'instruction', 'intimidation', 'persuasion', 'seduction'] 
    for i in range(0, len(points)): 
     row = eval("row" + str(i + 1)) 
     assignRow(row, points[i]) 
+0

辞書を生成するために使用するコードを投稿できますか? – perigon

答えて

1

それは辞書のように見えるんが、再生成されている、簡単ならば起こることができます関数​​は、ジェネレータを返すか、ループの次のサイクルで上書きされるグローバル変数を上書きします。

あなたはその時点での値を維持していることを確認しているように、収納時に辞書のディープコピーを取ることであろう問題を解決するためのハックシンプル-しかしウェイ:

def repeat(type, times): 
    best = 0 
    bestChar = [] 
    for i in range(0, times): 
     x = rollForCharacter(type) 
     if x[0] > best: 
      print("BEST:", x) 
      best = x[0] 
      # Create a brand new tuple, containing a copy of the current dict 
      bestChar = (x[0], x[1].copy()) 

しかし、正しい答えは、後のコードの影響を受けない一意の辞書変数を渡すことです。

this SO answerを参照してください。辞書に参照を渡すことは、変更可能なオブジェクトであるため危険になる可能性があります。

+0

リンクをありがとう、本当に助けてくれました。それは私がdeepcopy()が必要であることが判明しますが、それは素晴らしい作品です! –

関連する問題