Что происходит со сферой в этой программе для начинающих Python? - PullRequest
0 голосов
/ 27 мая 2020

Я довольно опытный программист 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# я бы ожидал, что guessesTaken в объявлении For выходит за рамки остальной части программы. Однако при более позднем использовании переменной нет проблем с доступом к рассматриваемому номеру.

Чтобы проверить это, я добавил переменную testNumber в блок For и присвоил ей значение «5». Конечно же, попытка распечатать число за пределами его области просто работает ...!

Я немного заржавел с программированием, но это все еще меня немного сбивает с толку - это For l oop не рассматривается ли область действия, отличная от окружающего ее блока? Эта страница , кажется, предполагает иное, но я полагаю, что вполне возможно, что циклы For в Python рассматриваются в области видимости с их окружением.

Это кажется немного странным. Кто-нибудь может поставить меня прямо здесь? Я вернусь к C#, чтобы проверить это на этом языке позже, но любые ответы сейчас были бы очень признательны. Спасибо!

1 Ответ

0 голосов
/ 27 мая 2020

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

Это, вероятно, спрятано где-то в документации .

Причина, по которой вы можете получить доступ к testNumber, заключается в том, что он назначен локальная область по умолчанию; если он не установлен явно, что в вашем коде является локальным для всего скрипта. Для l oop не считается, что он находится в другом объеме .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...