为什么我的猜测变量是Global?

时间:2018-07-30 02:26:37

标签: python python-3.x variables scope

  • Mac OS 10.13.16
  • Python 3.7
  • PyCharm

我正在看这个猜谜游戏的教程,遇到了我认为很奇怪的东西。在第18行,我调用了guess变量,尽管它是在其上方创建的for循环下的Local变量,但让我像调用它一样是Global。但是,如果在函数或循环中声明了var,则会使它成为本地变量。有人可以帮我解释一下吗。

import random
print("Hello what is your name?")
name = input()
print("Well " + name + " I am thinking of a number between 1 and 20")
secretNumber = random.randint(1,20)

for guessesTaken in range(1, 7):
    print("Take a guess.")
    guess = int(input())
    if guess < secretNumber:
        print("Sorry to low")
    elif guess > secretNumber:
        print("Sorry to high")
    else:
        break


if guess == secretNumber:
    print("Great job " + name + ". You guessed my number in " + str(guessesTaken) + " moves.")
else:
    print("Sorry the number I was thinking of is " + str(secretNumber))

2 个答案:

答案 0 :(得分:1)

来自另一个answer:来自python语言,这似乎是一个设计决策。函数仍然具有局部变量,但是for循环不会创建局部变量。

  

先前的使for循环变量位于循环本地的建议已偶然发现了现有代码的问题,该代码依赖循环变量在退出循环后保持其值,这似乎被认为是理想的功能。 / p>

http://mail.python.org/pipermail/python-ideas/2008-October/002109.html

答案 1 :(得分:0)

摘录自Python's documentation

  

块是作为单元执行的一段Python程序文本。   以下是块:模块,函数体和类   定义。交互键入的每个命令都是一个块。脚本文件   (作为标准输入提供给解释器或指定为   解释程序的命令行参数)是一个代码块。剧本   命令(在解释器命令行上用   “ -c”选项)是一个代码块。字符串参数传递给   内置函数eval()和exec()是代码块。

并且:

  

作用域定义了块中名称的可见性。如果是当地人   变量在一个块中定义,其范围包括该块。如果   定义发生在功能块中,范围扩展到任何块   包含在定义中,除非包含一个包含的块   名称的其他绑定。

     

在代码块中使用名称时,将使用最接近的名称进行解析   封闭范围。代码块可见的所有此类范围的集合是   称为街区的环境。

局部变量在同一代码块中的任何位置都可见。 for循环从定义上来说不是代码块,因此,for循环中定义的局部变量在循环之后仍在同一模块内可见。