列表()构造函数与列表?

list() constructor with list?

我是 Python 的新手,我不明白这段代码中 list() 函数的用途:

documents = [(list(movie_reviews.words(fileid)), category)
              for category in movie_reviews.categories()
              for fileid in movie_reviews.fileids(category)]

方法 words() 已经从字符串中返回标记化单词的列表,我看不出它和

有什么区别
documents = [(movie_reviews.words(fileid), category)
              for category in movie_reviews.categories()
              for fileid in movie_reviews.fileids(category)]

三种可能:

  1. 这是一个错误,不需要调用 list()

  2. 接口只保证方法return是Iterable类型,可以是以下任意一种:list、set、iterator、generator等。具体movie_reviews.words() 今天可能 return 一个列表,但在未来的版本中可能会改变,或者在其他 类 具有相似界面(child/parent/or 只是相似的界面)。

    是否是这种情况,应该在文档中明确说明,或者可以从继承层次结构中闪现出来。

  3. 该方法执行某种记忆,同时保留 returned 列表的副本。一个好的做法是在方法中复制缓存列表,但也许他们 returned 了一个共享列表对象。

    如果方法 return 是对共享列表对象的引用,那么最好调用 list(),以创建新的列表对象。如果没有复制操作,一方对 list 的任何更改(在方法内部与通过 documents 变量相比)都会混淆另一方。如果您通过 documents 变量更改列表,则使用相同的 fileid 调用 movie_reviews.words(fileid) 可能 return 错误的值。

    总的来说,虽然这是糟糕的设计,但在实际代码中会发生这种情况。我曾经不得不在实时代码中调试这样的问题。通常在memoization的情况下,return不可变的类型如元组,而不是列表,这样既保证速度又保证安全。