类实例不可迭代

时间:2015-10-08 02:03:09

标签: python class iterable hill-climbing

在我的功能中,我有:

        """
        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

我没有迭代我的类实例,指出,但我仍然得到:

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

2 个答案:

答案 0 :(得分:5)

问题在于这一行:

leftDoc

rightimport java.awt.EventQueue; import java.awt.GridLayout; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.text.BadLocationException; import javax.swing.text.Document; import javax.swing.text.PlainDocument; public class MirrorTextAreas { public static void main(String[] args) { new MirrorTextAreas(); } public MirrorTextAreas() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { ex.printStackTrace(); } JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new TestPane()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class TestPane extends JPanel { public TestPane() { JTextArea left = new JTextArea(10, 20); JTextArea right = new JTextArea(10, 20); setLayout(new GridLayout(1, 2)); add(new JScrollPane(left)); add(new JScrollPane(right)); MirrorDocument leftDoc = new MirrorDocument(); MirrorDocument rightDoc = new MirrorDocument(); left.setDocument(leftDoc); right.setDocument(rightDoc); leftDoc.addDocumentListener(new DocumentHandler(rightDoc)); rightDoc.addDocumentListener(new DocumentHandler(leftDoc)); } } public class MirrorDocument extends PlainDocument { private boolean ignoreUpdates; public void setIgnoreUpdates(boolean ignoreUpdates) { this.ignoreUpdates = ignoreUpdates; } public boolean isIgnoreUpdates() { return ignoreUpdates; } } public static class DocumentHandler implements DocumentListener { private MirrorDocument slaveDocument; private boolean ignoreUpdates = false; public DocumentHandler(MirrorDocument slaveDocument) { this.slaveDocument = slaveDocument; } @Override public void insertUpdate(DocumentEvent e) { Document doc = e.getDocument(); if (doc instanceof MirrorDocument) { MirrorDocument md = (MirrorDocument) doc; if (!md.isIgnoreUpdates()) { try { String text = e.getDocument().getText(e.getOffset(), e.getLength()); slaveDocument.setIgnoreUpdates(true); slaveDocument.insertString(e.getOffset(), text, null); } catch (BadLocationException ex) { ex.printStackTrace(); } finally { slaveDocument.setIgnoreUpdates(false); } } } } @Override public void removeUpdate(DocumentEvent e) { Document doc = e.getDocument(); if (doc instanceof MirrorDocument) { MirrorDocument md = (MirrorDocument) doc; if (!md.isIgnoreUpdates()) { try { slaveDocument.setIgnoreUpdates(true); slaveDocument.remove(e.getOffset(), e.getLength()); } catch (BadLocationException ex) { ex.printStackTrace(); } finally { slaveDocument.setIgnoreUpdates(false); } } } } @Override public void changedUpdate(DocumentEvent e) { } } } pointList += point pointList个实例。您只能将另一个iterable添加到iterable中。

您可以使用以下方法修复它:

list

point

在您的情况下,您无需将Point3D分配给pointList += [point] 。您也不需要将变量绑定到新点。您可以将其直接添加到列表中,如下所示:

pointList.append(point)

答案 1 :(得分:3)

list -

执行以下操作时
pointList += newPoint

类似于调用pointList.extend(newPoint),在这种情况下,newPoint必须是可迭代的,其元素将添加到pointList

如果你想要的只是简单地将元素添加到列表中,你应该使用list.append()方法 -

pointList.append(newPoint)