为什么循环变量没有在python中更新

May*_*kar 2 python

这段代码只打印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
Run Code Online (Sandbox Code Playgroud)

实际上,在调试代码时要确切地说,我看到它实际上更新了p的值但是each变量不会再次重新初始化.

Mar*_*nen 9

因为if type(each) == int:线.你的第三个元素是list([1, 2, 3])而不是int,所以它不会打印任何东西.

现在改变p变量的方法p是:只是对象的名称,而不是对象本身.如果你p = each在for循环中执行,它不会影响你循环的原始对象,它只是将名称更改p本地名称,该名称指向不同的对象.一旦循环结束,你的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
Run Code Online (Sandbox Code Playgroud)

这又一次,这不是递归的,你需要一个函数:

def print_elements(iterable):
    for element in iterable:
        if isinstance(element, list):
            print_elements(element)
        else:
            print element
Run Code Online (Sandbox Code Playgroud)

如果要将值解压缩到一个列表中以将其用于打印以外的其他内容,则应使用以下内容:

def recursive_unpack(iterable):
    for element in iterable:
        if isinstance(element, list):
            yield from recursive_unpack(element)
        else:
            yield element
Run Code Online (Sandbox Code Playgroud)

为什么我使用isinstance()而不是type():python中的isinstance()和type()之间的差异

此外,如果您希望将此应用于所有迭代(我的上一个示例)而不仅仅是列表:在Python中,如何确定对象是否可迭代?