这段代码只打印 1 2 4 5..我的问题是为什么 p 在第 3 次迭代时没有用新数组更新
p = [1, 2, [1, 2, 3], 4, 5]
for each in p:
if type(each) == int:
print each
else:
p = each
实际上在调试代码时我看到它实际上更新了 p 的值但 each
变量没有再次重新初始化。
最佳答案
因为 if type(each) == int:
行。您的第三个元素是列表 ([1, 2, 3]
) 而不是 int,因此它不会打印任何内容。
现在更改 p
变量:p
只是对象的名称,而不是对象本身。如果您在 for 循环内执行 p = each
,它不会影响您正在循环的原始对象,它只是将名称 p
更改为 local 名称,指向不同的对象。该轮循环一结束,您的 for 循环就会继续处理您正在循环的原始对象。
因此,请注意 p = each
不会更改现有对象(您正在循环的 p
),它只是创建一个新的本地名称 p
指向 each
的值。
您最可能想要的是这样的:
p = [1, 2, [1, 2, 3], 4, 5]
for each in p:
if isinstance(each, list):
for x in each:
print x
else:
print each
再说一次,这不是递归的,您需要一个函数:
def print_elements(iterable):
for element in iterable:
if isinstance(element, list):
print_elements(element)
else:
print element
如果你想将这些值解包到一个列表中以将它们用于打印以外的其他用途,你应该使用这样的东西:
def recursive_unpack(iterable):
for element in iterable:
if isinstance(element, list):
yield from recursive_unpack(element)
else:
yield element
为什么我使用 isinstance()
而不是 type()
:Differences between isinstance() and type() in python
此外,如果您希望它应用于所有可迭代对象(我的最后一个示例)而不仅仅是列表:In Python, how do I determine if an object is iterable?
关于python - 为什么在 python 中不更新循环变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30923241/