1
known_commands = {
    "boo"  : random.choice(["Winter is coming...","SURPRISE!","Mazel tov!"]),
    "xyzzy": xyzzy,
}


def xyzzy(self):

    print random.choice(["Winter is coming...","SURPRISE!","Mazel tov!"])
    return

クラスでは、Pythonで「ベビーボットネット」を作成しています。したがって、コマンドxyzzyまたはbooを呼び出すと、3秒ごとに実装されます(停止するように指示するまで)。booを呼び出すと、ランダムな要素が選択されますが、3秒ごとに同じランダムな要素が出力されます。xyzzyを呼び出すと、3秒ごとに新しいランダム要素が出力されます。

私が理解していることから、シードはbooの場合は変更されませんが、xzyyzの場合は変更されます。私の質問は、なぜシードが変更され、他のケースでは変更されないのかということです。

4

2 に答える 2

6

ここで選択します

"boo"  : random.choice(["Winter is coming...","SURPRISE!","Mazel tov!"]),

関数を呼び出しているので。この行が評価されると、dictは次のようになります。

known_commands = {
    "boo" : "SURPRISE!",
    "xyzzy" : xyzzy,
}

ただし、関数を呼び出すたびに選択が行われるため、xyzzyは毎回ランダムな文字列を取得します。booのランダムな文字列を毎回取得するには、関数またはラムダを作成する必要があります。ラムダを使用すると、次のようになります。

known_commands = {
    "boo"  : lambda: random.choice(["Winter is coming...","SURPRISE!","Mazel tov!"]),
    "xyzzy": xyzzy,
}
于 2012-04-12T18:20:53.840 に答える
1

booキー入力はknown_commands関数を指していません。辞書が作成されたときに一度だけ実行された結果値のを指しますrandom.choice。次のように変更します。

"boo": lambda: random.choice(["Winter is coming...", "SURPRISE!", "Mazel tov!"])
于 2012-04-12T18:19:51.437 に答える