2016-12-13 2 views
2

J'essaie de créer un jeu de cartes mais j'ai des problèmes avec les définitions. En particulier, la définition ci-dessous, devrait renvoyer un jeu mélangé (pas encore de combinaisons) sous la variable 'deck'. Cependant, je reçois l'erreur:Python- Code ne retenant pas la variable assignée dans la définition

NameError: 'name 'deck' is not defined.

Je peux éviter cela en ne pas utiliser les définitions, cependant, je veux avoir autant que possible dans les définitions pour le rendre plus facile à long terme. Merci d'avance.

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

Ce n'est pas ainsi que fonctionnent les valeurs de retour. Vous devez appeler votre fonction 'shuffle', qui retournera la valeur que' deck' contient. 'deck' est uniquement disponible dans la fonction. – Carcigenicate

Répondre

2

Deux points:

  1. Vous êtes en train de définir une fonction, mais ne sont pas l'appeler. Si vous n'appelez pas de fonction, le code qui s'y trouve n'est pas exécuté.

  2. La variable appelée deck est locale à la fonction et disparaît au retour de la fonction.

Voici une façon de résoudre les deux problèmes à la fois:

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

deck = shuffle() 
print deck[0] 

Pour être clair, il y a deux variables ici que les deux se passent à appeler deck et ne doit pas être confondu avec l'autre . Pour faire cette distinction claire, dans ce qui suit, je leur ai donné des noms différents:

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

global_deck = shuffle() 
print global_deck[0] 

Les deux extraits de code sont équivalentes.

0

La variable 'deck' est définie localement dans votre fonction. Vous ne pouvez donc pas l'utiliser en dehors de la définition de la fonction. Étant donné que votre fonction pont de retour, utilisez

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

au lieu

0

deck est seulement portée au sein shuffle. Pour accéder à la valeur brassages des retours, appelez shuffle, puis utilisez la valeur de retour:

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() 

Je pense que vous êtes progresse trop vite si vous avez fait cette erreur bien. En savoir plus sur la portée des variables, les fonctions d'appel et l'instruction return. Couvrir tout cela ici serait beaucoup trop long.

0

Lorsque vous return une valeur d'une fonction, il définit la valeur de cette fonction à la valeur retournée

-à-dire dans cet exemple, foo() serait égale à 4, donc 8 serait imprimé

def foo() 
    return 4 

print(foo() * 2) 

Dans votre exemple, vous devez modifier la dernière ligne à print(shuffle()[0]) et votre code fonctionnera comme prévu.