2015-10-08 3 views
2

Dans mon Func, je:instance de classe n'Iterable

 """ 
     Iterates 300 times as attempts, each having an inner-loop 
     to calculate the z of a neighboring point and returns the optimal     
     """ 

     pointList = [] 
     max_p = None 

     for attempts in range(300): 

      neighborList = ((x - d, y), (x + d, y), (x, y - d), (x, y + d)) 

      for neighbor in neighborList: 
       z = evaluate(neighbor[0], neighbor[1]) 
       point = None 
       point = Point3D(neighbor[0], neighbor[1], z) 
       pointList += point 
      max_p = maxPoint(pointList) 
      x = max_p.x_val 
      y = max_p.y_val 
     return max_p 

Je ne suis pas itérer sur mon instance de classe, le point, mais je néanmoins obtenir:

pointList += newPoint 
TypeError: 'Point3D' object is not iterable 

Répondre

5

Le problème est cette ligne :

pointList += point 

pointList est un list et point est un Point3D instance. Vous ne pouvez ajouter qu'un autre itérable à un itérable.

Vous pouvez le fixer avec ceci:

pointList += [point] 

ou

pointList.append(point) 

Dans votre cas, vous ne devez pas affecter None-point. Vous n'avez pas non plus besoin de lier une variable au nouveau point. Vous pouvez l'ajouter directement à la liste comme ceci:

pointList.append(Point3D(neighbor[0], neighbor[1], z)) 
3

Lorsque vous effectuez les opérations suivantes pour un list -

pointList += newPoint 

Il est semblable à appeler pointList.extend(newPoint), et dans ce cas newPoint doit être un itérable, dont les éléments seront ajoutés à pointList.

Si ce que vous voulez est d'ajouter simplement l'élément dans la liste, vous devez utiliser la méthode list.append() -

pointList.append(newPoint)