Python中显示变量未定义的错误消息。

2024-10-01 09:35:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用函数在python中创建一个简单的加密程序,但有一个问题,当我运行程序时,会收到一条错误消息,说“msgReversed”未定义)。在

该程序的工作原理是先反转用户的消息,然后将字母转换为键的值

alphabet=("abcdefghijklmnopqrstuvwxyz ")

def userInput():
    plaintext=input("Enter message to encript")
    k=int(input("Enter encription Key you want to use (1-25)"))
    return (k,plaintext)

def reverseMsg(plaintext):
    msgReversed=''
    leng=len(plaintext)-1
    for c in plaintext:
        msgReversed+=plaintext[leng]
        leng=leng-1
    print(msgReversed)
    return(msgReversed)

def encript(msgReversed,k):
    cipher=''
    for c in msgReversed:
        if c in alphabet:
            cipher+=alphabet[(alphabet.index(c)+k)%(len(alphabet))]
        print(cipher)

(k,plaintext)=userInput()
reverseMsg(plaintext)
(cipher)=encript(msgReversed,k)

错误消息如下所示:

^{pr2}$

Tags: toin程序消息inputdef错误cipher
3条回答

在最后一行中,将一个名为“msgReversed”的变量传递到“enccript”函数中。但是:msgReversed只在您的“reverseMsg”函数中本地定义。变量可以是只存在于函数内部的局部变量。或者全局变量,它们都存在于整个脚本中。一个简单的解决方法是通过在“reverseMsg”函数的第一行前面添加“global”,使msgReversed成为一个全局变量。从第一行到最后一行的另一个解决方案: msgReversed=reverseMsg(明文)

关于这个问题的简化教程:http://www.python-course.eu/global_vs_local_variables.php

添加了一个简单的示例:

myname = "Marc"

def printName():
    myname = "Sonder"
    print (myname)

printName()
print (myname)

在函数之外,'myname'函数将生成“Marc”。但是在函数内部,myname将生成“Sonder”。如果您要删除第一行,并尝试执行最后一行,以打印“myname”的全局版本,您将得到与现在完全相同的错误。在

为了理解这一点,我会复制这个脚本,看看当你注释掉某些部分时会有什么变化。在

正如我在评论中提到的,你的变量msgReversed并没有在你的函数之外声明,所以当你在函数外调用它时,它没有被定义。为了避免发布重复的答案,以下是另一种方法:

我不知道您以前是否使用过类,但是这里有一个示例和pythons的官方文档(https://docs.python.org/2/tutorial/classes.html

class Encrypt:

    def __init__(self):



        (k,plaintext)=self.userInput()
        self.reverseMsg(plaintext)
        cipher =self.encript(self.msgReversed,k)

    def userInput(self):
        plaintext=input("Enter message to encript")
        k=int(input("Enter encription Key you want to use (1-25)"))
        return (k,plaintext)

    def reverseMsg(self, plaintext):
        self.msgReversed=''
        leng=len(plaintext)-1
        for c in plaintext:
            self.msgReversed+=plaintext[leng]
            leng=leng-1
        print(self.msgReversed)
        return(self.msgReversed)

    def encript(slf, msgReversed, k):
        alphabet=("abcdefghijklmnopqrstuvwxyz ")
        cipher=''
        for c in msgReversed:
            if c in alphabet:
                cipher += alphabet[(alphabet.index(c)+k)%(len(alphabet))]
        print(cipher)

Encrypt()

至于全局变量,可以在函数中声明全局变量。您只需声明它是全局的:

^{pr2}$

因此,变量msgReversed的函数如下:

def reverseMsg(plaintext):
    global msgReversed
    msgReversed = ''
    leng=len(plaintext)-1
    for c in plaintext:
        msgReversed+=plaintext[leng]
        leng=leng-1
    print(msgReversed)
    return(msgReversed)

更改最后几行:

reverseMsg(plaintext)
(cipher)=encript(msgReversed,k)

为此:

^{pr2}$

相关问题 更多 >