Я пытаюсь создать карточную игру, но у меня проблемы с определениями. В частности, определение, приведенное ниже, должно возвращать перетасованную колоду (пока не подходит) под переменной «колода». Однако я получаю сообщение об ошибке:

NameError: 'name' deck 'не определено.

Я могу избежать этого, не используя определения, однако я хочу иметь как можно больше определений, чтобы облегчить их в долгосрочной перспективе. Заранее спасибо.

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
rational-pi 13 Дек 2016 в 20:54

4 ответа

Лучший ответ

Два момента:

  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
NPE 13 Дек 2016 в 18:00

Когда вы return получаете значение из функции, оно устанавливает значение этой функции на значение, которое вы вернули

т.е. в этом примере foo() будет равно 4, поэтому будет напечатано 8

def foo()
    return 4

print(foo() * 2)

В вашем примере вам нужно изменить последнюю строку на print(shuffle()[0]), и ваш код будет работать как положено.

0
STOMO7 13 Дек 2016 в 18:16

Переменная 'deck' определяется локально в вашей функции. Таким образом, вы не можете использовать его вне определения функции. Поскольку ваша функция возвращает колоду, используйте

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

Вместо

0
hfz 13 Дек 2016 в 17:58

deck находится только в области видимости shuffle. Чтобы получить доступ к значению, которое возвращает shuffle, вызовите 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
Carcigenicate 13 Дек 2016 в 17:59