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

Python 调用方法的实例似乎引用了相同的列表,python,methods,pygame,self,instances,Python,Methods,Pygame,Self,Instances,我正在学习Cravens pygame教程,需要一些说明。 以下是导致问题的代码: 代码1: get_snow方法似乎为我的Snowstorm类的两个实例创建了相同的列表。 例子: slow_storm调用get_snow方法,列表中附加了[123454] med_storm调用get_snow方法,并获得与slow_storm相同的列表[123454] 我通过添加self.snow_list=[]更改了代码,并能够生成所需的输出。 代码2: 通过使用另一种代码变体,我还能够生成正确的输出。 代

我正在学习Cravens pygame教程,需要一些说明。 以下是导致问题的代码: 代码1:

get_snow方法似乎为我的Snowstorm类的两个实例创建了相同的列表。 例子: slow_storm调用get_snow方法,列表中附加了[123454] med_storm调用get_snow方法,并获得与slow_storm相同的列表[123454]

我通过添加self.snow_list=[]更改了代码,并能够生成所需的输出。 代码2:

通过使用另一种代码变体,我还能够生成正确的输出。 代码3:

我在def get_snow(自我)之前添加了以下内容:

然后将实例修改为:

slow_storm = Snowstorm([])
med_storm.get_snow([])
问题:
1.为什么原始代码(代码1)中的实例似乎引用了相同的列表,即使它们使用self.snow_list? 2.使代码2和代码3正常工作的区别是什么


谢谢。

您将
snow\u list=[]
变量放在类的开头。这使它成为一个类变量,在类的所有实例中保持相同。要使列表分开,请将
snow\u list=[]
移动到类的
def\uuu init\uuu():
部分下。

snow\u list
是类变量,而不是实例变量:它是在类范围中定义的,而不是在
\uu init\uu
中定义的。因此,它由类的所有实例共享。如果希望
snow\u list
是特定于实例的,请在
Snowstorm.\uuu init\uu
中定义
self.snow\u list=[]
 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])
 def __init__(self,list):
            self.snow_list=list
slow_storm = Snowstorm([])
med_storm.get_snow([])