Python 调用方法的实例似乎引用了相同的列表
我正在学习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(自我)之前添加了以下内容: 然后将实例修改为: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: 通过使用另一种代码变体,我还能够生成正确的输出。 代
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([])