为什么不能命名在函数中创建的对象,使其与Python中的类名完全相同?

时间:2020-03-17 17:10:07

标签: python python-3.x jupyter-notebook python-object python-class

我正在使用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()),即使它们实际上并不相同,因为一个是变量,另一个是一类? Python在这种情况下也只是忽略了以下事实: Dealer()是类而不是变量“ dealer”?

谢谢!

P.S .:我使用Python 3.7.4

1 个答案:

答案 0 :(得分:4)

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

看一下您的代码:

player = player(name, money)

名称player是一个局部变量,尚无值。但是,您试图像函数或类一样调用它。你不能那样做。

如果您在左侧使用其他名称(如您发现的那样),player指的是您定义的类,它可以工作。

这是(一个原因)使用大写类名是标准的Python样式。这样可以解决问题,并使您更清楚地实例化一个类。

player = Player(name, money)

类似地,由于BlackJack是一个函数,因此应将其命名为blackjack

相关问题