【发布时间】:2021-12-30 19:19:07
【问题描述】:
所以我在 pygame 中测试了一件有趣的事情。我知道这段代码很糟糕,但这只是一个测试。 在这个程序中,我有一个代表 pygame 多边形的列表和它们的列表。在函数中,它返回更改的列表来绘制它。 但由于某种原因,无论我多么努力,它都会改变原来的“多边形”列表。但是,如果我将“mor”变量设置为“多边形”列表的 ctrl + c ctrl + v,它就可以正常工作 我疯了吗? .copy() 不应该创建不相关的列表吗?为什么“六边形”会发生变化?
import pygame
pygame.init()
sc = pygame.display.set_mode((1000, 1000))
clock = pygame.time.Clock()
WHITE = (255,255,255)
hexagon = [WHITE,[[669,207],[615,240],[615,305],[669,335],[725,305],[725,240]],8]
hexagon2 = [WHITE,[[669,335],[725,305],[725,240],[669,207],[615,240],[615,305]],8]
hexs = [hexagon,hexagon2]
hex = pygame.Surface((1000,1000))
state = 0
def morph (states,first):
global state
done = 0
current = first
for i in current[1]:
a = 0
for n in i:
try:
if n < states[state+1][1][current[1].index(i)][a]:
current[1][current[1].index(i)][a] += 1
elif n > states[state+1][1][current[1].index(i)][a]:
current[1][current[1].index(i)][a] -= 1
else:
done += 1
except:
if n < states[0][1][current[1].index(i)][a]:
current[1][current[1].index(i)][a] += 1
elif n > states[0][1][current[1].index(i)][a]:
current[1][current[1].index(i)][a] -= 1
else:
done += 1
a += 1
if done == len(current[1])*2:
if state + 1 <= len(states):
state += 1
else:
state = 0
return current
run = True
mor = hexagon[:]
while run:
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
hex.fill((0,0,0))
mor = morph(hexs,mor)
pygame.draw.polygon(hex,*mor)
sc.blit(hex,(0,0))
pygame.display.update()
clock.tick(60)
pygame.quit()
exit()
再次抱歉,糟糕的代码和糟糕的英语
【问题讨论】:
-
"不应该 .copy() 创建不相关的列表" -- deep copy(这是你想要的)和 shallow 之间是有区别的复制(这是您正在创建的)。
-
你从来没有真正在任何地方打电话给
.copy()。也就是说,hexagon[:]是一个 shallow 副本。请参阅copy模块,特别是copy.deepcopy函数,用于复制深度嵌套的结构。
标签: python