如何修复我分配的未分配变量的 UnboundLocalError?

How to fix UnboundLocalError for unassigned variable that I assigned?

我正在尝试使用 Turtle 库和递归在 Python 中创建科赫雪花生成器。我有一个带有十六进制代码的字符串列表,我正在使用变量 color 让笔按列表的顺序改变颜色。如您所见,我在函数定义之外定义了 color 但是当我尝试 运行 它时,我得到 UnboundLocalError 说 color 在它被分配之前被引用。我该如何修复错误,使我的代码 运行 符合预期?

这是我为生成雪花而编写的一些代码。 color 应该每画一条线就加一,所以下一次画线时使用的颜色是 palette[color % 6]

import turtle

turtle.colormode(255)
palette = ["#ff0f7b","#fd445d","#fc5552","#fa8139","#f98a34","#f89b29"]
color = 0

# Draw a Koch curve
def koch(iteration, length):
    if iteration == 1:
        turtle.forward(length/3)
        turtle.pencolor(palette[color % 6])
        color += 1
    else:
        koch(iteration-1, length/3)
    turtle.left(60)

这是我收到的错误消息:

Traceback (most recent call last):
  File "C:\Users\hummi\Python Files\koch_snowflake.py", line 49, in <module>
    koch_snowflake(4, 480)
  File "C:\Users\hummi\Python Files\koch_snowflake.py", line 41, in koch_snowflake
    koch(iteration, length)
  File "C:\Users\hummi\Python Files\koch_snowflake.py", line 15, in koch
    koch(iteration-1, length/3)
  File "C:\Users\hummi\Python Files\koch_snowflake.py", line 15, in koch
    koch(iteration-1, length/3)
  File "C:\Users\hummi\Python Files\koch_snowflake.py", line 15, in koch
    koch(iteration-1, length/3)
  File "C:\Users\hummi\Python Files\koch_snowflake.py", line 12, in koch
    turtle.pencolor(palette[color % 6])
UnboundLocalError: local variable 'color' referenced before assignment

你只需要添加一个global color语句,像这样:

color = 0

# Draw a Koch curve
def koch(iteration, length):
    global color
    if iteration == 1:
        turtle.forward(length/3)
        turtle.pencolor(palette[color % 6])
        color += 1

如果没有添加,修改 color 的值会使它成为局部范围的变量。由于在那个本地范围内,它还没有被分配,并且增量语句需要变量的先前值,所以你会得到你所看到的错误。添加 global color 语句会强制该语句引用全局 color 值,即使它正在修改该值。如果您只是从 color 读取数据,那么 global color 语句就没有必要了。这里有一个有点奇怪的 Python 事实。

我倾向于循环颜色而不是使用全局索引和模块化算法:

import turtle
from itertools import cycle

# palette = cycle(["#ff0f7b", "#fd445d", "#fc5552", "#fa8139", "#f98a34", "#f89b29"])
palette = cycle(['#ff0000', '#000000', '#00ffff', '#0000ff', '#00ff00'])

# Draw a Koch curve
def koch(iteration, length):

    if iteration == 1:
        turtle.pencolor(next(palette))
        turtle.forward(length)
    else:
        koch(iteration-1, length/3)
        turtle.left(60)
        koch(iteration-1, length/3)
        turtle.right(120)
        koch(iteration-1, length/3)
        turtle.left(60)
        koch(iteration-1, length/3)

koch(4, 300)

turtle.done()

调色板已更改,使颜色变化更明显: