为什么只有一个成员变量重置?

时间:2016-06-03 04:18:29

标签: python

我注意到在创建类的成员变量时我很困惑,然后在类方法中设置它们的值。基本上,在我的程序中,每当我在这个函数中更改两个成员变量时,它们都会像它们应该的那样改变。但是,当我创建该类的任何其他实例而不调用更改这些成员变量的方法时,只有一个保持不变。

class Game(object):
     isGoing=True
     board=[1,2,3]


     def __init__(self,name):
         self.name=name

     def test(self):
         self.board[0]="X"
         self.isGoing=False


 t1=Game("Testing")
 t1.test()
 print t1.isGoing
 print t1.board

 t2=Game("Testing")
 print t2.isGoing
 print t2.board

这将最终打印:

错误

[ 'X',2,3]

[ 'X',2,3]

我的问题是,为什么只有isGoing成员变量恢复为True,并且董事会名单保持不变?

1 个答案:

答案 0 :(得分:1)

这是因为您已将board分配给班级Game,而不是通过班级的__init__方法分配了个别实例,从而导致Game分享的每个实例相同的Game.board属性。为了确保每个实例都有自己独立的值__init__需要使用:

   def __init__(self, name):
       self.name = name
       self.board = [1, 2, 3]

如果您希望board成为具有潜在默认值的可分配参数,如果您写了类似

的内容,那么您将再次遇到与this issue类似的陷阱
   def __init__(self, name, board=[1, 2, 3]):
       self.name = name
       self.board = board

事实上,你的问题和那里概述的问题非常相似 - 这是由于Python是基于赋值的语言,并且如果为给定变量分配了相同的可变值并且调用其变异方法的事实,分配该值的所有变量都将看到更改生效。