python - 为什么在 python 中不更新循环变量

标签 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 变量没有再次重新初始化。

最佳答案

因为 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/

相关文章:

python - 如何根据 Kivy 中另一个小部件的值禁用一个小部件

python - Scrapy - Javascript 网站

python - 哪个 JavaScript 库更适合动态实时小部件/仪表板?

python - 为什么在 pyTorch 中列出模型组件没有用?

python - 对列表中的 Python 字典对象进行排序

python - QLineEdit 在 setText 后不显示文本

Python:包导入错误

python - 嵌套命名元组

python - 为什么链接器在未在任何地方指定时寻找 python36_d.lib?

Python:!= 和 "is not"之间的区别