Python Turtle - 尝试更新一个数组值会更新同一列表索引的所有值
Posted
技术标签:
【中文标题】Python Turtle - 尝试更新一个数组值会更新同一列表索引的所有值【英文标题】:Python Turtle -- Trying to update one array value updates all the values of the same list index 【发布时间】:2022-01-22 01:11:24 【问题描述】:我正在编写一个程序,该程序根据输入的行数和列数绘制正方形网格,获取输入的行、列和颜色索引(来自颜色查找表的索引),然后绘制另一个正方形在具有指定颜色和位置的网格上。循环直到输入一个空值。
我为网格的颜色索引值创建了一个位图数组,每个嵌套列表代表一行正方形,每个正方形的初始值设置为 0。
我想在每次绘制新的颜色方块时更新数组中的单个值。
我尝试使用
更新数组中的值bitmap[row_index][col_index] = clut_index
在输入循环中,还有
bitmap[row][col] = colorindex
在绘制彩色方块的函数中。
每次,它不是更新数组中的一个值,而是用相同的列表索引更新数组中的所有值,以便每一行/列表最终都具有相同的值。
例如,一个输入
5 6
对于网格大小,以及
0 2 3 2 5 1 4 0 5
彩色方块的结果应该是
[[0, 0, 3, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 1], [ 0, 0, 0, 0, 0, 0], [5, 0, 0, 0, 0, 0]]
但结果是
[[5, 0, 3, 0, 0, 1], [5, 0, 3, 0, 0, 1], [5, 0, 3, 0, 0, 1], [ 5, 0, 3, 0, 0, 1], [5, 0, 3, 0, 0, 1]]
方块在网格上绘制得很好,但位图列表没有正确更新。
如何一次只更新数组中的一个值?这是我的代码,我将有关位图数组的部分加粗。很抱歉这个程序很长而且相当混乱:
from turtle import *
from array import *
#inputting the number of rows and columns to make the grid
grid_dimensions = input("Please input the number of rows and number of columns, separated by a space:")
grid_list = grid_dimensions.split(" ")
rows = int(grid_list[0])
columns = int(grid_list[1])
# setting the window size as an aspect ratio of the rows and columns
# this is to make sure that each grid cell is a square
# window has a max size of 800 pixels
if rows > columns:
window_w = (800/rows)*columns
window_h = 800
elif rows < columns:
window_w = 800
window_h = (800/columns)*rows
else:
window_w = 800
window_h = 800
# creating window and coordinate grid
# coordinates are in pixels, grid is the same size as the window
setup(window_w, window_h)
setworldcoordinates(0, 0, window_w, window_h)
# setting the side length of the square as the size of each grid cell
square_length = window_w/columns
# creating a color look-up table of RGB color values
clut = [(1.0, 1.0, 1.0), (0.0, 0.0, 0.0), (1.0, 0.0, 0.0), (1.0, 1.0, 0.0), (0.0, 1.0, 0.0), (0.0, 1.0, 1.0), (0.0, 0.0, 1.0), (1.0, 0.0, 1.0)]
# creating a bitmap array of the color index value for each square in the grid
# populating the array by setting each value to zero
rowline = []
bitmap = []
for col in range(columns):
rowline.append(0)
for row in range(rows):
bitmap.append(rowline)
# moves the pen to the starting position of each square
def movepos(x, y):
penup()
setpos(x, y)
pendown()
# draws the square based on the row and column positions on the grid
# uses the static square size
def drawsquare(row, col, square_size):
movepos(col*square_size, row*square_size)
for i in range(4):
forward(square_size)
left(90)
# calls the function to draw a square in a loop for the number of columns and rows
def drawgrid(row_number, col_number, square_size):
for row in range(row_number):
for col in range(col_number):
drawsquare(row, col, square_size)
# "colors in the grid cell" by drawing a colored square at a specific row and column position
def colorpixel(row, col, colorindex, square_size):
fillcolor(clut[colorindex])
begin_fill()
drawsquare(row, col, square_size)
end_fill()
# drawing the initial empty grid
drawgrid(rows, columns, square_length)
# creates an empty list to put the input values into
# creates a starting value for the loop
# takes the first set of row, column, and color input values to draw a colored square
index_input = input("Please input a row number, a column number, and a color number separated by spaces, then hit Enter. To finish coloring, hit Enter without entering any values: ")
# loops to draw multiple colored squares
# loop breaks when an empty value is entered
while index_input:
input_list = index_input.split(" ")
row_index = int(input_list[0])
col_index = int(input_list[1])
clut_index = int(input_list[2])
bitmap[row_index][col_index] = clut_index
colorpixel(row_index, col_index, clut_index, square_length)
index_input = input("Please input another row number, a column number, and a color number separated by spaces, then hit Enter. To finish coloring, hit Enter without entering any values: ")
#prints the bitmap array
print(bitmap)
done()
【问题讨论】:
【参考方案1】:我相信问题出在这里:
for row in range(rows):
bitmap.append(rowline)
矩阵中的每一行都是相同的列表,我们需要让它们唯一列表:
for row in range(rows):
bitmap.append(list(rowline)) # force a copy
这不是 Python 乌龟问题,而是通用 Python 编程问题。
【讨论】:
非常感谢!这解决了问题,我真的很感激。 :)以上是关于Python Turtle - 尝试更新一个数组值会更新同一列表索引的所有值的主要内容,如果未能解决你的问题,请参考以下文章