如何修复我分配的未分配变量的 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()
调色板已更改,使颜色变化更明显:
我正在尝试使用 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()
调色板已更改,使颜色变化更明显: