简体   繁体   中英

I forgot my basic python skills What am I doing wrong?

I'm little forgotten about python sdince I don't use it since a while and I can't solve this seemingly very basic error.

I'm doing a very naif approach to code a chess engine and I'm not being able of correctly separate instances of classes.

In my code:

class Piece:
  def __init__(self, name='', symbol='', color='', value=0, position=(0,0)):
   self.name=name   
   self.color=color
...
class Army:
  def __init__(self, color="", pieces=[]):
      self.color=color
      self.pieces=pieces
black=Army()
for rank in range(8):
 black.pieces.append(Piece())
 black.pieces[rank].color="B"
 print(Army().pieces[rank].color)

Output:

B
B
B
B
B
B
B
B

Instead of '' to which Piece() defaults. Note that the output points to Army() and not to black instance for which that output would be the expected.

Shouldn't separate class instances take separate values? I really can't figure out what's going on.

My full code is:

class Game:
 def __init__(self, name="chess",score=0,board=""):
  self.name=name
  self.board=board
  self.score=score
class Board:
 def __init__(self, position="", size=[8,8]):
   self.size=size
   self.position=position
class Piece:
  def __init__(self, name='', symbol='', color='', value=0, position=(0,0)):
# vector=[[0,0],[0,0]])
   self.name=name
   self.color=color
   self.value=value
   self.position=position
#   self.vector=vector

class Army:
  def __init__(self, color="", pieces=[]):
      self.color=color
      self.pieces=pieces
chess=Game()
chess.name="FIDE"
chess.board=Board()
chess.board.size=[8,8]
checker=Piece()
checker.name="checker"
checker.value=100
checker.vector=(1,0)
black=Army()
black.color="B"
for rank in range(8):
 black.pieces.append(Piece())
 black.pieces[rank].color="B"
print(Army().pieces)

white=Army()
white.color="W"
for rank in range(8):
 white.pieces.append(Piece())
 white.pieces[rank].color="W"
 print( len(black.pieces))
for ch in white.pieces:
 print (ch.color)
print(black)
print(white)
print(len(white.pieces))
print(black.color)
#print (white.pieces.color)

I suppose that's because you should not use mutable lists as a default values. All the instances of Board() keep references to the same size list. All the Army() instances use the same pieces list as well.

Please try to update your code using approach described below:

def __init__(self, color="", pieces=[]):
    self.pieces = pieces

# ->

def __init__(self, color="", pieces=None):
    if pieces is None:
        pieces = []
    self.pieces = pieces

So you'll be creating a new, separate, instance of list per each __init__() call.

More info: Mutable Default Method Arguments In Python

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM