我正在通过Cravens pygame教程,需要一些澄清。 以下是导致此问题的代码: CODE1:
import pygame
import random
# Define some colors
BLACK = ( 0, 0, 0)
WHITE = ( 255, 255, 255)
GREEN = ( 0, 255, 0)
RED = ( 255, 0, 0)
pygame.init()
size = (700, 500)
screen = pygame.display.set_mode(size)
pygame.display.set_caption("'Classy' Snow Globe")
class Snowstorm():
snow_list = []
snow_num = 0
snow_size = 0
snow_speed = 0
def get_snow(self):
for i in range(self.snow_num):
x = random.randrange(0, 700)
y = random.randrange(0, 500)
self.snow_list.append([x,y])
def draw_snow(self,screen):
for i in range(len(self.snow_list)):
pygame.draw.circle(screen,WHITE,self.snow_list[i],2)
self.snow_list[i][1] = self.snow_list[i][1] + self.snow_speed
if self.snow_list[i][1] > 500:
y = random.randrange(-50,-10)
self.snow_list[i][1] = y
x = random.randrange(0,700)
self.snow_list[i][0] = x
slow_storm = Snowstorm()
slow_storm.snow_num = 1
slow_storm.snow_size = 20
slow_storm.snow_speed = 1
slow_storm.get_snow()
med_storm = Snowstorm()
med_storm.snow_num = 2
med_storm.snow_size = 20
med_storm.snow_speed = 3
med_storm.get_snow()
done = False
clock = pygame.time.Clock()
while not done:
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True
screen.fill(BLACK)
slow_storm.draw_snow(screen)
med_storm.draw_snow(screen)
pygame.display.flip()
clock.tick(60)
pygame.quit()
get_snow方法似乎为我的Snowstorm类的两个实例创建了相同的列表。 例: slow_storm调用get_snow方法,该列表附加[123,454] med_storm调用get_snow方法,并获取与slow_storm相同的列表[123,454]
我通过添加self.snow_list = []来更改代码,并且能够生成所需的输出。 CODE2:
def get_snow(self):
self.snow_list = []
for i in range(self.snow_num):
x = random.randrange(0, 700)
y = random.randrange(0, 500)
self.snow_list.append([x,y])
我还可以使用其他代码变体生成正确的输出。 CODE3:
我在def get_snow(self)之前添加了这个:
def __init__(self,list):
self.snow_list=list
然后将实例修改为:
slow_storm = Snowstorm([])
med_storm.get_snow([])
问题:
1.为什么原始代码(CODE1)中的实例似乎引用相同的列表,即使它们使用的是self.snow_list?
2.使CODE2和CODE3正常工作有哪些区别?
谢谢。
答案 0 :(得分:1)
您将snow_list = []
变量放在类的开头。这使它成为一个类变量,使其在类的所有实例中保持相同。要将列表分开,请将snow_list = []
移到该类的def __init__():
部分。