列表迭代器中的项值不更新

时间:2017-06-30 00:39:26

标签: python image python-3.x scope iterator

我有一些代码会循环浏览properties徽标,而这些属性会自行转换为徽标。

问题是,我有一个" AntiAliasing / SuperSampling"检查properties["antialias"] == True

的功能

如果启用了AA,它会暂时将某些大小调整属性覆盖为三倍大小,渲染,然后缩减为原始大小(通过除以三)。

以下是重要的代码的简短部分:

if properties["antialias"]:
    properties["font_size"] *= 3
    properties["base_size"] = (properties["base_size"][0] * 3,
                               properties["base_size"][1] * 3)
    properties["padding"] = (properties["padding"][0] * 3,
                             properties["padding"][1] * 3)

在那里,您可以看到font_size(tuple) base_size(tuple) padding全部乘以3。这是已加载的属性中的所有大小调整信息。

所以在那之后,图像由PIL(Pillow)和生成,然后通过以下方式缩小尺寸:

if properties["antialias"]:
    logo_image = logo_image.resize((round(logo_image.width  / 3),
                                    round(logo_image.height / 3)), Image.ANTIALIAS)

问题是,第一张图片工作正常。然后,由该循环生成的其他图像都以三个 power 指数增长。这显然是不是指数代码。

我达成的结论是每个"属性" (每个循环使用的项目)调用的字典不会更改(可能只是修改后的值),而是重复乘以3。

(基本上我认为改变的值在每个循环中保持不变。)

这是您所期望的循环:

for properties in logo_list:

以下是完整代码,如果您需要阅读它。它从外部范围变量和其他函数调用,但我不希望这对此问题很重要。

for properties in logo_list:
    if weight in properties["weights"]:
        logo_name = "".join([region["text"] for region in properties["regions"]])
        logo_file = logo_name + "-" + file[:-4] + "." + properties["type"].lower()
        out_dir = os.path.join("out", logo_name)

        try:
            os.makedirs(out_dir)
        except FileExistsError:
            pass

        if properties["antialias"]:
            properties["font_size"] *= 3
            properties["base_size"] = (properties["base_size"][0] * 3,
                                       properties["base_size"][1] * 3)
            properties["padding"] = (properties["padding"][0] * 3,
                                     properties["padding"][1] * 3)

        logo_image = generate(properties, font_path)

        if properties["shrink"]:
            logo_image = logo_image.crop(logo_image.getbbox())

        if properties["padding"]:
            logo_image = padding(properties, logo_image)

        if properties["antialias"]:
            logo_image = logo_image.resize((round(logo_image.width  / 3),
                                            round(logo_image.height / 3)), Image.ANTIALIAS)

        if properties["background"]:
            logo_image = background(properties, logo_image)

        logo_image.save(os.path.join(out_dir, logo_file), properties["type"])

Since people asked, here is the absolute full code.

1 个答案:

答案 0 :(得分:1)

编辑:您正在循环遍历文件,然后为每个文件循环遍历logo_list。然后修改logo_list的项目。因此第二个文件将使用logo_list及其修改的项目。这意味着你每次都会乘以三,这会产生指数增长。