没有局部变量,但警告:赋值前引用

No local variables, but warning: referenced before assignment

我使用 PyCharm 社区编辑器进行了一个简单的练习,但收到警告:

This inspection warns about local variables referenced before assignment.

但是这里没有局部变量,而且它在Windows PowerShell 上运行良好。它出什么问题了?

# This is a guess the number game.
import random
secret_number = random.randint(1, 21)
print("I am thinking of a number between 1 and 20. You have three chances.")

# Ask the player to guess 3 times.
for guesses_taken in range(1, 4):
    guess = int(input('Take a guess.\n'))
    if guess > secret_number:
        print('Your guess is too high.')
    elif guess < secret_number:
        print('Your guess is to low.')
    elif guess == secret_number:
        if guesses_taken == 1:
            print('Oh my god. You just guessed only one time.')
        else:
            print("You are right. I'm thinking of %s, and you guessed my 
                number in %s guesses." % (secret_number, guesses_taken))
    else:
        break
if guess != secret_number:  --> # Name 'guess' can be not defined.
    print('Nope. The number I was thinking of was ' + str(secret_number) + '.')

同样,这里修改后的版本还是有同样的问题

# This is a guess the number game.
import random
secret_number = random.randint(1, 21)
print("I am thinking of a number between 1 and 20. You have three chances.")

# Ask the player to guess 3 times.
for guesses_taken in range(1, 4):
    guess = int(input('Take a guess.\n'))
    if guess > secret_number:
        print('Your guess is too high.')
    elif guess < secret_number:
        print('Your guess is to low.')
    else:
        break
if guess == secret_number:  --> # Name 'guess' can be not defined
    if guesses_taken == 1:  --> # Name 'guesses_taken' can be not defined
        print('Oh my god. You just guessed only one time.')
    else:
        print("You are right. I'm thinking of %s, and you guessed my number in %s guesses." % (
            secret_number, guesses_taken))
else:
    print('Nope. The number I was thinking of was ' + str(secret_number) + '.')

您收到 警告:它们并不意味着您的代码无法按预期工作,而是告诉您事情 可能会出错 在某些情况下。

我不使用 PyCharm,但我看到这些警告的原因是:

  • guessfor 循环中分配。因此,如果循环未至少执行一次,则永远不会分配 guess

  • guesses_taken 将首先被分配给 range 的第一个值,然后是第二个...但是如果 range 是空的,它也永远不会被分配。

参见,例如:

for loop_index in range(1, -1):  # empty! 
    my_value_assigned_in_loop = 1

print(loop_index)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-31-39f9878362fc> in <module>()
      2     my_value_assigned_in_loop = 1
      3 
----> 4 print(loop_index)

NameError: name 'loop_index' is not defined