【发布时间】:2019-06-21 01:08:36
【问题描述】:
为什么 Python 在使用索引号进行迭代时工作方式不同?例如,对于 zip 函数(在 for 循环中使用时没有索引),值不会存储在变量中。虽然使用 enumerate() 函数(允许我在 foo 循环中有一个“索引”),但它通常会发生。
当我尝试在循环内外打印时,不使用索引的解决方案对我的“宽度”变量有不同的值,这里 zip() 函数用于处理两个列表同时不需要处理它们的索引:
tableData = [['apples', 'oranges', 'cherries', 'banana'],
['Alice', 'Bob', 'Carol', 'David'],
['dogs', 'cats', 'moose', 'goose']]
def printTable(myListOfLists):
colWidths = [0] * len(myListOfLists)
for lists, width in zip(myListOfLists, colWidths):
for item in lists:
if width < len(item):
width = len(item)
print(width) #This prints my 'width' rightly
print(colWidths) #This prints my 'width' wrongly
printTable(tableData)
上面的代码产生以下不需要的输出:
8
5
5
[0, 0, 0]
但是如果我使用 enumerate() (生成索引以同时处理两个列表)在我的 for 循环中修改的值将正确保存在宽度变量中,请参见代码示例:
tableData = [['apples', 'oranges', 'cherries', 'banana'],
['Alice', 'Bob', 'Carol', 'David'],
['dogs', 'cats', 'moose', 'goose']]
def printTable(myListOfLists):
colWidths = [0] * len(myListOfLists)
for index, lists in enumerate(myListOfLists):
for item in lists:
if colWidths[index] < len(item):
colWidths[index] = len(item)
print(colWidths[index]) #This prints my 'width' rightly
print(colWidths) #This ALSO prints my 'width' rightly
printTable(tableData)
第二个输出是:
8
5
5
[8, 5, 5]
那么,请问如何使用 zip() 并修改我的“外部”变量?我究竟做错了什么?谢谢。
【问题讨论】:
-
通过
width = len(item),您正在使用len(item)值重新分配变量(将其值从列表更改为另一个)width,您不是使用列表而是使用变量本身。在第二种情况下,colWidths也是列表,但您通过更改某个索引下的项目来影响它。 -
请问正确的做法是什么? @达米安
标签: python list for-loop variables