【问题标题】:Local variable 'list' referenced before assignment分配前引用的局部变量“列表”
【发布时间】:2014-09-26 04:22:30
【问题描述】:

我制作了一个简单的脚本,可以将任何输入文本转换为“代码”,也可以将其翻译回来。它一次只能工作一个词。

我想让脚本将每个新代码添加到每次打印的列表中。例如,第一次翻译某些内容时,"HELLO" 变为 "lohleci"。第二次,我希望它不仅显示"world" = "ldwropx",而且在下面说明到目前为止所有翻译的内容。

我是 Python 新手,曾浏览论坛寻找有类似问题的人。我尝试这样做的方式(一个段被删除并放入一个单独的脚本中),我得到一个错误,说“在赋值之前引用了局部变量'列表'”。这是产生错误的代码:

list = "none"
def list():
    word = raw_input("")
    if list == "none":
        list = word + " "
        print list
        list()
    else:
        new_list = list + word + " "
        list = new_list
        print list
        list()
list()

【问题讨论】:

  • 您不应将名称list 用作变量或函数。你的函数也在递归调用自己,这是你想要的吗?
  • 是的,有点。正如我所说,我从一个更大的脚本中提取了这个,在它翻译的每个单词之后,它都会回到你输入下一个单词的部分。我的问题是我希望最终能够输入特定的内容,例如 /print 并让它显示我在本次会议中翻译的所有内容。所以这实际上并不是它的发展方式,它只是我为了测试而抽出的部分,是的,它应该重复自己。谢谢你看着它。 :) 我尝试了这个,但是在名单下没有任何内容,它仍然给了我这个错误。还有其他建议吗?
  • 你应该使用循环而不是递归,除非你真的知道你需要递归。关心stack overflow(不是这个网站!)。你的问题不清楚,如果你能给出任何预期的输出会有所帮助。
  • 正如 Leo Law 已经说过的,你不应该使用名称list,因为那是 Python 函数的名称。对变量使用 the_list 之类的东西,或者对函数使用 make_list() 之类的东西。
  • 好的。谢谢!我会尝试所有这些建议。

标签: python


【解决方案1】:

您的代码有几个问题,所有这些问题都可以通过更多的知识来解决。

  1. 不要将名称list 用于您自己的变量或函数。它是一个内置 Python 函数的名称,如果您将该名称用于您自己的函数,您将无法调用该内置函数。 (至少,你不应该尝试学习的高级技巧。)
  2. 您还将相同的名称 (list) 重新用于两个不同的事物,一个变量一个函数。不要那样做;给它们起不同的、有意义的名字来反映它们的本质。例如,wordlist 用于包含单词列表的变量,get_words() 用于您的函数。
  3. 与其使用一个名为list 的变量来累积一组字符串,但实际上不是一个Python 列表,为什么不使用一个真正的Python 列表呢?它们专为满足您的需求而设计。

您可以像这样使用 Python 列表:

wordlist = []
# To add words at the end of the list:
wordlist.append("hello")
# To print the list in format ["word", "word 2", "word 3"]:
print wordlist
# To put a single space between each item of the list, then print it:
print " ".join(wordlist)
# To put a comma-and-space between each item of the list, then print it:
print ", ".join(wordlist)

不要太担心join() 函数,以及为什么分隔符(列表项之间的字符串)出现在join() 之前。这涉及到类、实例和方法,稍后您将了解这些内容。现在,专注于正确使用列表。

另外,如果你正确使用列表,你就不需要if list == "none" 检查你正在做的事情,因为你可以append() 到一个空列表以及一个包含内容的列表。所以你的代码会变成:

示例 A

wordlist = []

def translate_this(word):
    # Define this however you like
    return word

def get_words():
    word = raw_input("")
    translated_word = translate_this(word)
    wordlist.append(translated_word)
    print " ".join(wordlist)
    # Or: print ", ".join(wordlist)
    get_words()

get_words()

现在我建议再做一项更改。不要每次都在最后调用你的函数,而是使用while 循环。 while 循环的条件可以是任何你喜欢的;特别是,如果您将条件设为 Python 值 True,则循环将永远不会退出并继续循环,如下所示:

示例 B

wordlist = []

def translate_this(word):
    # Define this however you like
    return word

def get_words():
    while True:
        word = raw_input("")
        translated_word = translate_this(word)
        wordlist.append(translated_word)
        print " ".join(wordlist)
        # Or: print ", ".join(wordlist)

get_words()

最后,如果你想尽早退出循环(任何循环,而不仅仅是无限循环),可以使用break 语句:

示例 C

wordlist = []

def translate_this(word):
    # Define this however you like
    return word

def get_words():
    while True:
        word = raw_input("")
        if word == "quit":
            break
        translated_word = translate_this(word)
        wordlist.append(translated_word)
        print " ".join(wordlist)
        # Or: print ", ".join(wordlist)

get_words()

到目前为止,这应该可以解决您的大部分问题。如果您对此代码的工作原理有任何疑问,请告诉我。

【讨论】:

  • 我得先走了,但我会尽快回复你!看起来有点复杂,但嘿,我正在努力学习! :D 非常感谢您的帮助!我会投票/最喜欢等,但我是全新的,我没有足够的声誉或类似的东西? .-.这有点奇怪
  • @JamesHartman - Stack Overflow 的设计目的是让新用户一开始除了提出问题或回答其他人的问题外,无能为力。特别是,不允许新用户为答案投票,以避免人们创建一堆虚假帐户并为自己的答案投票。但是,一旦您获得了 15 个声望点,您就可以为答案投票。
  • @JamesHartman - 同时,如果您发现有用的答案,您可以随时接受。接受答案意味着“在我收到的所有答案中,这个是最好的”——如果后来有人给出了更好的答案,您可以改为接受那个答案。单击分数下方的复选标记的轮廓接受答案。
  • @JamesHartman - 如果您对我的回答感到害怕,请一次浏览一个示例。从学习示例 A 开始,直到您开始理解它。然后,一旦您掌握了示例 A,请继续学习示例 B。一旦您理解了示例 B,然后继续学习示例 C。这应该有助于您将新知识消化成小块。
  • 很好的答案。不过还有一个问题。这是全局变量的使用。默认情况下,python 不允许您写入全局变量,而无需先声明该变量在您的范围内是全局的(在本例中为函数的范围)。如果未声明为全局,则赋值将创建一个遮蔽全局的局部。这种情况下的实际错误是python认为list是局部变量,但是if语句在给它一个值之前读取了它的值。
猜你喜欢
  • 2022-01-02
  • 2019-10-10
  • 1970-01-01
  • 2021-04-02
  • 2020-07-08
  • 1970-01-01
  • 2017-08-10
  • 2020-01-16
  • 2019-12-05
相关资源
最近更新 更多