2016-12-13 17 views
2

私はカードゲームを作成しようとしていますが、定義に問題があります。特に、以下の定義は、変数 'deck'の下にシャッフルされたデッキ(スートはまだありません)を返します。しかし、私はエラーが表示されます。Python-定義中に変数が割り当てられていないコード

NameError: 'name 'deck' is not defined.

私は定義を使用していないことで、これを避けることができ、しかし、私は長期的にはそれを容易にするための定義では、できるだけ多くを持っていると思います。前もって感謝します。

import random 
playerhand=[] 
dealerhand=[] 

def shuffle(): 
    numbers = [] 
    faces = ['T', 'J', 'Q', 'K', 'A'] 
    for i in range(8): 
     numb = str(i + 2) 
     numbers.append(numb) 
    values=numbers+faces 
    deck=4*values 
    random.shuffle(deck) 
    return deck 

print deck[0] 
+2

これは戻り値の仕組みではありません。関数 'shuffle'を呼び出す必要があります。これは、' deck'が保持していた値を返します。 'deck'は関数内でのみ利用可能です。 – Carcigenicate

答えて

2

2点:

  1. あなたは関数を定義しているが、それを呼び出していません。関数を呼び出さないと、その中のコードは実行されません。

  2. deckと呼ばれる変数は、関数に対してローカルであり、関数が戻ると消えます。ここで

が一度に両方の問題を解決する一つの方法です:

def shuffle(): 
    ... 
    deck = ... 
    ... 
    return deck 

deck = shuffle() 
print deck[0] 

だけ明確にすること、二つの変数が両方ともdeckと呼ばれるように、互いに混同してはならない起こることをここにあります。この区別を明確にするために、以下では異なる名前を付けました:

def shuffle(): 
    ... 
    local_deck = ... 
    ... 
    return local_deck 

global_deck = shuffle() 
print global_deck[0] 

2つのコードスニペットは同等です。

0

'deck'変数は、関数内でローカルに定義されています。したがって、関数定義の外では使用できません。あなたの関数は、デッキを返すので、代わりに

print shuffle()[0] # this is outside of the function scope 

を使用

0

deckshuffle内のみ有効範囲内にあります。リターンをシャッフル値にアクセスするには、shuffleを呼び出し、それは、戻り値だ使用:あなたがが、このミスを犯した場合

import random 
playerhand=[] 
dealerhand=[] 

def shuffle(): 
    numbers = [] 
    faces = ['T', 'J', 'Q', 'K', 'A'] 
    for i in range(8): 
     numb = str(i + 2) 
     numbers.append(numb) 
    values=numbers+faces 
    deck=4*values 
    random.shuffle(deck) 
    return deck 

print shuffle() 

私はあなたがあまりにも急速に進んでいると思います。変数スコープ、関数の呼び出し、およびreturnステートメントの詳細を参照してください。ここにあるすべてのものを覆うことは、あまりにも長くなるでしょう。

0

関数からあなたreturn値、それはあなたがこの例ですなわち

を返された値にその機能の値を設定し、foo()は4に等しくなるが、それゆえ8

印刷されます

例では、最後の行をprint(shuffle()[0])に変更する必要があり、コードが期待通りに機能します。