[英]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))
(一次迭代一次matrix1
和matrix2
。這在您的用法中比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.