实例调用方法似乎引用相同的列表

时间:2014-03-08 02:18:28

标签: python methods pygame self instances

我正在通过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正常工作有哪些区别?

谢谢。

1 个答案:

答案 0 :(得分:1)

您将snow_list = []变量放在类的开头。这使它成为一个类变量,使其在类的所有实例中保持相同。要将列表分开,请将snow_list = []移到该类的def __init__():部分。