簡體   English   中英

Python的list()函數修改其參數?

[英]list() function of Python modifies its argument?

(我是Python的新手,即使閱讀了本教程,很多事情也困擾着我...)

最初,我有如下代碼:

strings = ['>abc', 'qwertyu', '>def', 'zxcvbnm']
matrix  = zip(*strings)
for member in matrix:
    print("".join(member)) # characters are printed as expected

-達到了我的預期。 但是由於某種原因,我想確定矩陣中的成員數。 由於len(matrix)給出了錯誤,我決定將其復制並轉換為列表: mtxlist = list(matrix) 令人驚訝的是,此行之后,矩陣的內容似乎已更改-或至少我不能以上述相同的方式使用它:

strings = ['>abc', 'qwertyu', '>def', 'zxcvbnm']
matrix  = zip(*strings)
mtxlist = list(matrix) # this assignment empties (?) the matrix
for member in matrix:
    print("".join(member)) # nothing printed

有人可以解釋發生了什么嗎?

您使用的是Python 3,對嗎?

zip返回一個只能迭代一次的生成器。 如果要多次使用它,則可以選擇:

每次需要時都寫zip(*strings)

matrix = tuple(zip(*strings))

(可以任意多次迭代matrix 。這是一個簡單的選擇。缺點是,如果zip(*strings)很大,那么它將占用大量生成器不會使用的內存。)

matrix1, matrix2 = itertools.tee(zip(*strings))

(一次迭代一次matrix1matrix2 。這在您的用法中比tuple差,但是如果您要部分消耗matrix1 ,然后使用matrix2 ,更多的matrix1 ,則很有用)

def matrix():
    return zip(*strings)
# or
matrix = lambda: zip(*strings)

(可以重復使用,但可以隨意使用matrix()而不是matrix 。不像tuple解決方案那樣使用額外的內存來存儲結果,但是使用它的語法有點煩人)

class ReusableIterable:
    def __init__(self, func):
        self.func = func
    def __iter__(self):
        return iter(self.func())

matrix = ReusableIterable(lambda: zip(*strings))

(反復使用matrix可以多次。處理語法煩惱,盡管您仍然必須注意,如果在matrix迭代之間修改strings ,則會得到不同的結果。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM