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

时间:2015-06-18 18:40:33

标签: 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

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

2 个答案:

答案 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)