0

我正在 Jupyter 笔记本中编写 Black Jack 游戏,为此我有一个“玩家”和一个“经销商”类以及一个基本上运行整个游戏的函数 (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 认为我想在我分配变量之前给它自己分配一个变量 (dealer = Dealer()),即使它们实际上并不相同,因为一个是变量并且其他是类?那么在这种情况下,Python 是否只是忽略了例如dealer() 是一个类而不是变量“dealer”这一事实?

提前致谢!

PS:我使用 Python 3.7.4

4

1 回答 1

4

在函数中的任何位置分配一个名称使其成为局部变量,除非该变量已在函数中声明为全局变量。在给它一个值之前尝试引用这个变量是错误的。

所以看看你的代码:

player = player(name, money)

该名称player是一个局部变量,还没有值。但是您正试图将其称为函数或类。你不能那样做。

如您所见,如果您在左侧使用不同的名称,则player指的是您定义的类并且它可以工作。

这是(一个原因)使用大写的类名是标准的 Python 风格。这将解决问题并更清楚地表明您正在实例化一个类。

player = Player(name, money)

同样,因为BlackJack是一个函数,所以应该命名为blackjack.

于 2020-03-17T17:22:19.250 回答