0
class anagram_generator:
    words = ""
    letters = []
    def get_words():
        words = raw_input("input the letters\n")
        letters = []
        i = 0

    def sort_words():
        for word in words:
            letters.append(word)
            print letters[i]
            i = i + 1

    get_words()
    sort_words()

为什么 sort_words 不打印出 words 字符串和 letters 数组?

4

2 回答 2

2

您需要将函数中的变量“单词”和“字母”声明为全局变量,如下所示:

def sort_words():
global words
global letters
i=0
for word in words:
    letters.append(word)
    print letters[i]
    i = i + 1

函数内部的变量只能在函数中访问,不能访问“外部”的变量,并且在您的情况下保持为空(“”或 []),另请参见Python Doc(搜索“全局”)。

另一件事是未使用初始值声明的 i 变量也会引发错误。

于 2012-10-29T01:28:55.560 回答
2

我不知道你为什么把类放在这里,因为缩进不是真的,你使用“方法”的方式不像你想使用类。我有两个代码。一个是使用类,另一个是没有。

首先,假设您真的想使用 class (我认为这最适合您的问题):

class Generator:
    words = ""  # you should put words and letters here. this will be attribute and both get_words() and sort_words() can see this
    letters = []
    def get_words(self):
        words = raw_input("input the letters\n")
        letters = []
        # i = 0 : no effect. it just local variable with method get_words

    def sort_words(self):
        i = 0  # must be assign value before use
        for word in words:
        letters.append(word)
        print letters[i]
            i = i + 1

你应该注意到,当你使用类时,每个方法都必须有关键字self。这是测试:

generator = Generator()
generator.get_words()
generator.sort_words()

如果这只是正常功能。您的问题不起作用,因为某些原因:

1)单词和字母可能不会被声明为 global。因此,当您在 get_words() 中为这些变量赋值时,sort_words() 看不到这一点。如果您编译并且没有错误,只是出于某种原因,您已经在全局中分配了这些值(类型名称并在其他地方分配值,而不是在任何函数中)。但在这种情况下,当您使用 get_words() 时,那些全局仍然不会更新。因此,没有您看到的“打印字”,因为您使用的“字”还没有更新。

2) i 变量:必须在使用前赋值。

所以,这是我修复的代码:

def get_words():
    global words
    global letters
    words = raw_input("input the letters\n")
    letters = []
    # global i=0 : you can do that, but SHOULDN'T

def sort_words():
    i = 0 # i must be assign value before use
    for word in words:
        letters.append(word)
        print letters[i]
        i = i + 1

测试将是:

get_words()
sort_words()

希望对你有帮助 :)

于 2012-10-29T01:38:00.967 回答