【问题标题】:Accessing List from outside function从外部函数访问列表
【发布时间】:2013-01-18 12:26:48
【问题描述】:

我有一个在function1 中创建的列表。我希望能够在function2 中访问和修改它。如果没有全局变量,我怎么能做到这一点?

两个函数都没有嵌套在另一个函数中,我需要能够将其概括为多个函数中的多个列表。

我希望能够在其他功能中访问word_list 和sentence_starter。

def Markov_begin(text):
    print create_word_lists(text)
    print pick_starting_point(word_list)
    return starting_list


def create_word_lists(filename):
   prefix_dict = {}    
   word_list = []
   sub_list = []
   word = ''

   fin = open(filename)
   for line in fin:
      the_line = line.strip()
      for i in line:
           if i not in punctuation:
               word+=(i)
           if i in punctuation:
               sub_list.append(word)
               word_list.append(sub_list)
               sub_list = []
               word = ''
      sub_list.append(word)
      word_list.append(sub_list)
   print 1
   return word_list

def pick_starting_point(word_list):
    sentence_starter = ['.','!','?']
    starting_list = []
    n = 0
    for n in range(len(word_list)-1):
        for i in word_list[n]:
            for a in i:
                if a in sentence_starter:
                    starting_list += word_list[n+1]
    print 2                
    return starting_list



def create_prefix_dict(word_list,prefix_length):
    while prefix > 0:
        n = 0
        while n < (len(word_list)-prefix):
            key = str(''.join(word_list[n]))
            if key in prefix_dict:
                prefix_dict[key] += word_list[n+prefix]
            else:
                prefix_dict[key] = word_list[n+prefix]
           n+=1
       key = ''
       prefix -=1

print Markov_begin('Reacher.txt')

【问题讨论】:

    标签: python list function global


    【解决方案1】:

    你应该把它重构为一个类:

    class MyWords(object):
      def __init__(self):
        self.word_list = ... #code to create word list
    
      def pick_starting_point(self):
        # do something with self.word_list
        return ...
    

    用法

    words = MyWords()
    words.pick_starting_point()
    ...
    

    【讨论】:

      【解决方案2】:

      您可以简单地将第一个函数创建的列表用作第二个函数的参数:

      def some_list_function():
        # this function would generate your list
        return mylist
      
      def some_other_function(mylist):
        # this function takes a list as an argument and process it as you want
        return result
      
      some_other_function(some_list_function())
      

      但是,如果您需要在多个地方使用列表(由多个函数处理),那么将其存储为变量并不是一件坏事——更重要的是,如果您的列表生成函数进行一些计算来生成列表,您只需计算一次即可节省 CPU。

      【讨论】:

      • 我不确定我是否完全理解。请查看新添加的代码,我希望它可以更好地解释我的问题。感谢您的帮助。
      • 您只需将生成列表的函数调用作为参数(而不是全局变量)传递给处理您要生成的列表的函数调用。
      【解决方案3】:

      如果您不想 a) 使用全局或 b) 返回列表并传递它,那么您将不得不使用一个类并将您的列表保存在那里。

      上课路线最好

      【讨论】:

      • 您能否解释一下我将如何走“返回”路线。谢谢。
      • gahooa的解决方案最好使用class。但是,您可以将列表保存在 Makov_begin 函数中的本地字典变量中。然后在调用函数时传递字典或字典中的特定列表。例如dictOfLists['wordlist'] = create_word_lists(text, dictOfLists)
      【解决方案4】:

      函数可以有属性值(例如,参见question 338101。)

      在当前上下文中,您可以将 prefix_dict、word_list、sub_list 和 word 等项目保存并引用为计算它们的任何函数的单独属性,如下例所示。但是,正如其他答案中所建议的那样,从长远来看,使用类更容易理解和维护。

      例如:

      In [6]: def fun1(v):
          fun1.li = range(v,8)
          return v+1
         ...: 
      
      In [7]: def fun2(v):
          fun2.li = range(v,12) + fun1.li
          return v+2
         ...: 
      
      In [8]: fun1(3)
      Out[8]: 4
      
      In [9]: fun2(6)
      Out[9]: 8
      
      In [10]: fun2.li
      Out[10]: [6, 7, 8, 9, 10, 11, 3, 4, 5, 6, 7]
      

      【讨论】:

      • -1:给 python 初学者的可怕建议。这就像建议编写一个返回一个生成器的元类,该生成器产生 lambda,每个处理一个列表推导,从而产生一个映射列表。好吧,不太像那样,但说真的……
      • @gahooa,废话,函数属性好用易懂,给定问题的措辞,一个合理的替代提法。此外,我指出“使用类……从长远来看,更容易理解和维护。”
      猜你喜欢
      • 1970-01-01
      • 2017-05-25
      • 2013-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-15
      • 2020-05-01
      相关资源
      最近更新 更多