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()
更新
我把你的全部代码都修改了,所以没有任何混乱。此外,我还将restartsome\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谢谢我该如何将其写入代码中?