在赋值之前可能会引用局部变量 - Python

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在赋值之前可能会引用局部变量 - Python相关的知识,希望对你有一定的参考价值。

我一直在尝试制作加密和解密系统,但我遇到了一个小错误。这是我的代码:

    import sys
    import pyperclip


    def copy(data):
        question = input("Copy to clipboard? ")

        if question.lower() == 'yes' or question.lower() == 'y':
            pyperclip.copy(data)
            print("Encrypted message copied to clipboard.")
            rerun()

        elif question.lower() == 'no' or question.lower() == 'n':
            rerun()

        else:
            print("You did not enter a valid input.")
            copy(data)


    def rerun():
        ask = input("
Would you like to run this program again? ")

        if ask.lower() == "yes" or ask.lower() == "y":
            print(" ")
            run()

        elif ask.lower() == 'no' or ask.lower() == 'n':
            sys.exit("
Thank you!")

        else:
            print("You did not enter a valid input.")
            rerun()


    def encrypt(key, msg):
        encrypted_message = []
        for i, c in enumerate(msg):
            key_c = ord(key[i % len(key)])
            msg_c = ord(c)
            encrypted_message.append(chr((msg_c + key_c) % 127))
        return ''.join(encrypted_message)


    def decrypt(key, encrypted):
        msg = []
        for i, c in enumerate(encrypted):
            key_c = ord(key[i % len(key)])
            enc_c = ord(c)
            msg.append(chr((enc_c - key_c) % 127))
        return ''.join(msg)


    def run():
        function_type = input("Would you like to encrypt or decrypt a message? ")

        if function_type.lower() == "encrypt" or function_type.lower() == "e":
            key = input("
Key: ")
            msg = input("Message: ")
            data = encrypt(key, msg)
            enc_message = "
Your encrypted message is: " + data
            print(enc_message)
            copy(data)

        elif function_type.lower() == "decrypt" or function_type.lower() == "d":
            key = input("
Key: ")

            question = input("Paste encrypted message from clipboard? ")

            if question.lower() == 'yes' or question.lower() == 'y':
                encrypted = pyperclip.paste()
                print("Message: " + encrypted)

            elif question.lower() == 'no' or question.lower() == 'n':
                encrypted = input("Message: ")

            else:
                print("You did not enter a valid input.")
                run()

            decrypted = decrypt(key, encrypted)
            decrypted_message = "
Your decrypted message is: " + decrypted
            print(decrypted_message)
            copy(decrypted)

        else:
            print("
You did not enter a valid input.
")
            run()

    run()

它表示在分配和突出显示之前可能会引用局部变量'encrypted'

    decrypted = decrypt(key, encrypted)

在run()函数下。

是因为我在其他函数中使用了变量'encrypted'吗?如果是这样,我将如何解决此问题并仍然保持我的程序的功能?

我对python比较陌生,所以如果你能解释一下你的答案我会很感激。

答案

在分配之前可能会引用局部变量'encrypted'

是一个由linter产生的警告。

这是因为linter看到encrypted在两个if条件下被赋值

 if question.lower() == 'yes' or question.lower() == 'y':

elif question.lower() == 'no' or question.lower() == 'n':

然而,如果条件相互补充,短绒不能知道这两个。因此,考虑到没有条件为真的情况,变量encrypted将最终未初始化。

要消除此警告,您可以使用if值在任何None条件之前简单地初始化变量

另一答案

如果执行else分支,则没有定义encrypted。 IDE不知道你再次调用run()

请记住,这可能会导致无限递归,因此您应该使用另一个控制流机制(尝试使用在输入有效时断开的while循环)

另一答案

run()之前添加encrypted = None

以上是关于在赋值之前可能会引用局部变量 - Python的主要内容,如果未能解决你的问题,请参考以下文章

Pycharm - 禁用'局部变量'xxx'可能在分配之前被引用'

一篇文章让你明白python的装饰器

在装饰方法中赋值之前引用的局部变量

Django:UnboundLocalError:在赋值之前引用的局部变量'company'

赋值前引用的局部变量?

在python中的赋值错误之前引用的变量[重复]