Python 变量已定义,但表示未定义

Python 变量已定义,但表示未定义,python,python-3.x,Python,Python 3.x,我正在完成一个作业,但问题是它说“重启”是未定义的,即使它在整个作业中都有定义 我在它的本地位置有错误,所以我把它设为全局,但现在它说“重启”是未定义的 def main(): global restart def changeMyList(myList): for i in range(len(myList)): myList[i] = myList[i].title()

我正在完成一个作业,但问题是它说“重启”是未定义的,即使它在整个作业中都有定义

我在它的本地位置有错误,所以我把它设为全局,但现在它说“重启”是未定义的

def main():   

        global restart

        def changeMyList(myList):
            for i in range(len(myList)):
                myList[i] = myList[i].title()
            myList.sort()

        soccer_teams = ["Arsenal", "Chelsea", "Liverpool", "Barcelona", "Juventus", "Manchester City", "Atletico Madrid", "Borussia Dortmund"]

        team_length = len(soccer_teams)

        changeMyList(soccer_teams)

        print("|||||" + str(team_length) + " TEAMS" + "|||||")

        import random

        for team in soccer_teams:
            print(team)

        shuffle_user = input("Reshuffle? Y/N: ")
        if shuffle_user == 'y':
            random.shuffle(soccer_teams)
            print("List after first shuffle: ", soccer_teams)

            random.shuffle(soccer_teams)
            print("List after second shuffle: ", soccer_teams)
            restart = input("Run Again? Y/N: ").lower()

        if restart == 'y':
                        main()

        elif restart == 'n':
                        exit



main()

当我按'n'时,当它要求重新排列时,它会说“名称'restart'未定义”第32行;第40行此代码中定义
重新启动的唯一位置是:

restart = input("Run Again? Y/N: ").lower()

if shuffle\u user==“y”:
块中。因此,如果您对“重新洗牌”提示回答“否”,则不会为
重新启动
变量分配任何值,并且尝试读取该变量会产生
名称错误

重新启动
是在
if
中定义的,这就是您无法访问该变量的原因,范围在if:

restart = input("Run Again? Y/N: ").lower()
    restart = "n"
    if shuffle_user == 'y':
        random.shuffle(soccer_teams)
        print("List after first shuffle: ", soccer_teams)

        random.shuffle(soccer_teams)
        print("List after second shuffle: ", soccer_teams)
        input("Run Again? Y/N: ").lower()
因此,您必须将其向上移动并移出if:

restart = input("Run Again? Y/N: ").lower()
    restart = "n"
    if shuffle_user == 'y':
        random.shuffle(soccer_teams)
        print("List after first shuffle: ", soccer_teams)

        random.shuffle(soccer_teams)
        print("List after second shuffle: ", soccer_teams)
        input("Run Again? Y/N: ").lower()

您很少需要使用全局关键字。在您的情况下,最简单的解决方案是将restart作为参数传递给main()

更新 我把你的全部代码都修改了,所以没有任何混乱。此外,我还将restart
some\u global\u accessible\u var
命名为restart,以明确到底发生了什么。在您的情况下,实际上不需要全局定义
重新启动

如果您仍然对变量范围感到困惑,这似乎是一个不错的解释。另外,关于
if
语句中的变量范围,这是一个很好的StackOverflow问题

some_globally_accessible_var = ''

def main(restart):   
        def changeMyList(myList):
            for i in range(len(myList)):
                myList[i] = myList[i].title()
            myList.sort()

        soccer_teams = ["Arsenal", "Chelsea", "Liverpool", "Barcelona", "Juventus", "Manchester City", "Atletico Madrid", "Borussia Dortmund"]

        team_length = len(soccer_teams)

        changeMyList(soccer_teams)

        print("|||||" + str(team_length) + " TEAMS" + "|||||")

        import random

        for team in soccer_teams:
            print(team)

        shuffle_user = input("Reshuffle? Y/N: ")
        if shuffle_user == 'y':
            random.shuffle(soccer_teams)
            print("List after first shuffle: ", soccer_teams)

            random.shuffle(soccer_teams)
            print("List after second shuffle: ", soccer_teams)
            restart = input("Run Again? Y/N: ").lower()

        if restart == 'y':
                        main(restart) #remember to pass restart to your function here!

        elif restart == 'n':
                        exit



main(some_globally_accessible_var)

有关错误的解释,请参见pppery的答案。

定义表示已设置。在某些条件下,有可能不设置。请再次检查逻辑
全局重新启动
不创建变量。当您将赋值时,它仅通知函数使用外部/全局变量
restart=new\u value
。所以一开始这个变量不存在。当
shuffle\u user
不是
y
时,它不会运行
restart=input(..)
,也不会创建变量。因此,如果您建议删除
global
关键字,那么当您选中
restart==“y”
时,最后一个变量不存在,因为在python函数中修改变量的任何尝试都会将该变量声明为局部变量,即使存在同名的全局变量。@pppery这是真的,但我想他实际上并不需要它作为一个全球性的。我添加了一个变通方法,以使其全局可访问。另外,您需要使用直接引号(
restart=''
)声明
restart
),而不是像您的答案那样使用卷曲引号。我不知道如何在我的手机上执行此操作xD@pppery谢谢我该如何将其写入代码中?