错误消息说变量未定义。蟒蛇

时间:2016-05-21 20:46:11

标签: python function

我正在尝试使用函数在python中创建一个简单的加密程序但我遇到了一个问题,当我运行程序说(' msgReversed'未定义)时,我收到错误消息。

程序的工作原理是首先反转用户消息,然后将字母移动到Key的值

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)

错误消息如下所示:

Line 26, in <module>
    (cipher)=encript(msgReversed,k)
NameError: name 'msgReversed' is not defined

4 个答案:

答案 0 :(得分:0)

在最后一行中,您传递了一个名为&#39; msgReversed&#39;的变量。进入你的'encript&#39;功能。但是:msgReversed仅在您的&#39; reverseMsg&#39;中本地定义。功能。 变量可以是仅存在于函数内部的局部变量。或全局变量,它们存在于整个脚本中。一个简单的解决方法是通过简单地添加&#39; global&#39;来使你的msgReversed成为一个全局变量。在你的反向行动的第一行前面功能。第一行到最后一行的另一个解决方案: msgReversed = reverseMsg(明文)

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

添加了一个简单的例子:

myname = "Marc"

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

printName()
print (myname)

在功能之外,&#39; myname&#39;功能将产生&#34; Marc&#34;。但是在函数内部,myname将产生&#34; Sonder&#34;。如果您要删除第一行,并尝试执行最后一行,要打印全局版本的&#39; myname&#39;,您将得到与您现在完全相同的错误。

要掌握这一点,我会复制这个脚本,看看你在评论某些部分时会发生什么变化。

答案 1 :(得分:0)

改变你的最后几行:

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

对此:

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

答案 2 :(得分:0)

当您从msgReversed函数返回reverseMsg()变量时,需要将其分配给外部作用域中的新变量。

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

我怀疑出现以下这一行引起的混淆:

return msgReversed  # Note, the brackets aren't required here

在传递变量reverseMsg()时从函数msgReversed返回。但是,默认情况下,此变量不会分配到任何位置 - 名称msgReversed特定于函数。要存储从函数返回的值,您需要提供一个变量名来存储它。因此,以下内容:

msgReversed = reverseMsg(plaintext)

...会将函数返回的值存储在名为msgReversed new 变量中。您还可以将该变量命名为其他内容:

this_is_another_msgReversed = reverseMsg(plaintext)

如果你没有提供一个变量来赋值,那么它就会丢失:

reverseMsg(plaintext)
# No msgReversed variable here

答案 3 :(得分:0)

正如我的评论中所提到的,你的变量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()

对于全局变量,您可以在函数中声明全局变量。您所要做的就是将其声明为全局:

variable_name global

所以你的变量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)