这个初学者 Python 计划的范围是怎么回事?

What is going on with scope in this beginners Python program?

我是一位相当有经验的 C# 程序员,正在研究 Python。我正在研究一本名为 Python 发明你自己的电脑游戏的书。第二章特色游戏...

# This is a Guess the Number game.
import random

# guessesTaken = 0

print ("Hello! What is your name?")
myName = input()

number = random.randint(1,10)
print("Well, " + myName + ", I am thinking of a number between 1 and 10.")

for guessesTaken in range(6):
    print ("Take a guess.") # Four spaces in front of "print"
    guess = input()
    guess = int (guess)

    testNumber = 5

    if guess < number:
        print("Your guess is too low.") # Eight spaces in front of "print"

    if guess > number:
        print ("Your guess is too high.")

    if guess == number:
        break

if guess == number:
    guessesTaken = str(guessesTaken + 1)
    print ("Good job, " + myName + "! You guessed my number in " + guessesTaken + " guesses!")

if guess != number:
    number = str(number)
    print ("Nope. The number I was thinking of was " + number + ".")

testNumber = str(testNumber)
print (testNumber)

我对 guessesTaken 变量有点困惑,所以我注释掉了它的实例化行 - 惊讶地发现代码仍然表现正常。

在 C# 中,我希望 For 声明中的 guessesTaken 超出程序其余部分的范围。但是,以后使用该变量访问相关数字没有问题。

为了对此进行测试,我在 For 块中添加了变量 'testNumber' 并将其分配为“5”。果然,尝试在其范围之外打印数字就可以了...!

我对编程有点生疏,但这对我来说仍然有点困惑 - For 循环是否不被视为与它周围的块不同的范围? This page 似乎另有建议,但我想可能是 Python 中的 For 循环在其周围环境的范围内被考虑。

只是看起来有点奇怪。有人可以把我放在这里吗?稍后我会回到 C# 以使用该语言对此进行测试,但现在任何答复都将不胜感激。谢谢!

for guessesTaken in range(6): 创建变量 guessesTaken 而无需您显式地执行它,这就是为什么以下代码也可以工作(结果为 9):

for x in range(0, 10):
    pass
print(x)

但是,这会导致 NameError:

print(x)
for x in range(0, 10):
    pass

这可能隐藏在 documentation 的某个地方。

您可以访问 testNumber 的原因是它已分配给 local scope by default; unless it's explicitly set, which in your code, happens to be local to the entire script. The for loop is not considered to be in a different scope