此代码仅打印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
变量不会再次重新初始化。
答案 0 :(得分:9)
由于if type(each) == int:
行。你的第三个元素是一个列表([1, 2, 3]
),而不是一个int,因此它不会打印任何内容。
现在更改p
变量:p
只是对象的名称,而不是对象本身。如果您在for循环中执行p = each
,它不会影响您正在循环的原始对象,它只会将名称p
更改为 local name,指向不同的对象。一旦循环结束,你的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?
答案 1 :(得分:0)
问题出在else语句中,你基本上说如果每个都不是int(在你的情况下它是一个列表),那么将列表p设置为内部列表。
我认为你想要做的事情可以通过
之类的东西来完成p = [1, 2, [1, 2, 3], 4, 5]
for element in p:
if type(element) == int:
print element
else:
for otherElement in element:
if type(otherElement) == int:
print otherElement
在这种情况下,else语句通过内部列表并检查它包含的元素(otherElement)