Почему вы не можете назвать объект, который создается в функции, точно так же, как его имя класса в Python? - PullRequest
0 голосов
/ 17 марта 2020

Я программирую игру Блэк Джек в ноутбуке Jupyter, для этого у меня есть класс «игрок» и «дилер», а также функция (BlackJack ()), которая в основном запускает всю игру.

def BlackJack():   
    name = input("What is your name: ")
    while True:
        try:            
            money = int(input(f"Welcome to our casino Black Jack game {name}!How big is your balance in € : "))
        except ValueError:
            print("Just give me a number: ")
        else:
            print("Ok, let's start!")
            break
    player = player(name, money) # player() class
    dealer = dealer()            # dealer() class

При попытке создать объекты класса с тем же именем, что и у самого класса, возникает ошибка:

Сообщение об ошибке:

What is your name: "Richard"
Welcome to our casino Black Jack game "Richard"!How big is your balance in € : 19163
Ok, let's start!
---------------------------------------------------------------------------
UnboundLocalError                         Traceback (most recent call last)
<ipython-input-55-3c92f609e237> in <module>
----> 1 BlackJack()

<ipython-input-54-57fc63786581> in BlackJack()
      9             print("Ok, let's start!")
     10             break
---> 11     player = player(name, money)
     12     dealer = dealer()

UnboundLocalError: local variable 'player' referenced before assignment

Но если я называю объекты класса разными или я называю их одинаковыми, но вне функции ошибка отсутствует:

def BlackJack():   
    name = input("What is your name: ")
    while True:
        try:            
            money = int(input(f"Welcome to our casino Black Jack game {name}!How big is your balance in € : "))
        except ValueError:
            print("Just give me a number: ")
        else:
            print("Ok, Let's Start!")
            break
    plyr = player(name, money)
    dlr = dealer()

или

player = player("Jimmy", 1200)

Это только потому, что в функции Python считает, что я хочу присвоить себе переменную еще до того, как назначу переменную (дилер = дилер ()), даже если они на самом деле не совпадают, потому что один является переменной, а другой является классом? Так что Python в этом случае просто игнорирует тот факт, что, например, дилер () является классом вместо переменной "дилер"?

Заранее спасибо!

PS: пользуюсь Python 3.7.4

1 Ответ

3 голосов
/ 17 марта 2020

Присвоение имени в любом месте функции делает его локальной переменной, если только переменная не была объявлена ​​глобальной в функции. Попытка обратиться к этой переменной до того, как вы дали ей значение, является ошибкой.

Итак, глядя на ваш код:

player = player(name, money)

Имя player является локальной переменной, и еще не имеет значения. Но вы пытаетесь назвать его как функцию или класс. Вы не можете этого сделать.

Если вы используете другое имя на левой стороне, как вы обнаружили, player относится к определенному вами классу, и он работает.

Это ( одна из причин) это стандартный Python стиль, использующий заглавные буквы классов. Это решит проблему и прояснит, что вы создаете экземпляр класса.

player = Player(name, money)

Точно так же, поскольку BlackJack является функцией, она должна называться blackjack.

...