[Tutor] ValueError:too many values to unpack (passing 2d array to class)

Carnell, James E jecarnell at saintfrancis.com
Wed Sep 19 17:05:31 CEST 2007


Any help would greatly appreciated.

Question: I am getting the following error from the validMove function:
ValueError: too many values to unpack

This program (currently) consists of a 2dArray and objects (represented
by integers) 
in that array that can be moved. 

I am guessing that it has to do with copying a 2dArray to a local member
value. I thought
that it was just copying a pointer to the array and not the entire
array, but I am not
sure anymore. 

To tell the truth I have decided to change how this whole thing is done,
but I really want
to learn why this didn't work before I do. 

There are three sections
- code
- command line example of error
- conceptual example if code doesn't make sense

========================================================================
=======

class WorldObject:
    def __init__(self):
        s = self
        s.curPos = [0,0]
    def createRandomPosition(s,arrayEnv):
        """takes a 2d array and returns a random position for placement
of object.
           currentPosition contains 2 integers for column and row."""
        s.curPos[0] = random.randint(0,len(arrayEnv)-1)
        s.curPos[1] = random.randint(0,len(arrayEnv[0])-1)
        return s.curPos
    def validMove(s,arrayEnv,newPosition):
        """calls to see if newPosition is inside the bounds of the 2d
environment array
           and then if the newPosition is not a wall or something that
the object can
           not go through (unblocked)"""

        s,arrayEnv = arrayEnv####### THIS MIGHT BE MY PROBLEM Is it just
copying a pointer?#######

        s.newPos = newPosition #newPosition for example is [0,1] to go
East or [-1,-1] to go NorthWest
        if s.insideArray(s.arrayEnv,s.newPos) and
s.unblocked(s.arrayEnv,s.newPos):
            s.curPos[0] += s.newPos[0]
            s.curPos[1] += s.newPos[1]
            return s.curPos
        else:
            return curPos #returns the same position that was evaluated
w/o changes
    def insideArray(s, arrayEnv,newPosition):
        """called by validMove to make sure I don't get an out bounds
error for newPosition"""
        s.newPos = newPosition#so I can fit everything on one line
        if s.curPos[0] + s.newPos[0] < 0 or s.curPos[0] + s.newPos[0] >=
len(arrayEnv[0]):
            return False
        elif s.curPos[1] + s.newPos[1] < 0 or s.curPos[1] + s.newPos[1]
>= len(arrayEnv):
            return False
        else:
            return True
    def unblocked(s,arrayEnv,newPosition):
        """called by validMove to make sure that I am not walking
through walls. For ease
           of explanation arrayEnv just holds integers. If the integer
is >= 5 then I can't
           walk through it"""
        s.newPos = newPosition
        if arrayEnv[s.curPos[0] + s.newPos[0]][s.curPos[1] +
s.newPos[1]] < 5:
            return True
        elif arrayEnv[s.curPos[0] + s.newPos[0]][s.curPos[1] +
s.newPos[1]] >= 5:
            return False
        else:
            print "error in World Object unblocked function"
            return False

==================================COMMAND LINE
ERROR===================================
>>> env = [[0,0,0],[0,0,0],[0,0,0]]

>>> apple = WorldObject()

>>> apple.createRandomPosition(env)
[1, 2]

>>> newPosition = [0,0] #not moving anywhere at all

>>> apple.insideArray(env,newPosition)
True

>>> apple.unblocked(env,newPosition)
True

>>> apple.curPos
[1, 2]

>>> apple.validMove(env,newPosition)
Traceback (most recent call last):
  File "<input>", line 1, in ?
  File "<input>", line 27, in validMove
ValueError: too many values to unpack

======================CONCEPTUAL EXAMPLE IF CODE DOESN'T MAKE
SENSE=======================

env = [[0,0,0],[0,0,0],[0,0,0]]

currentPosition = [1,1]

WorldObject is represented by the number 7

env[ currentPosition[0] ][ currentPosition[1] ] = 7 

env = [[0,0,0],[0,7,0],[0,0,0]]

newPosition = [0,0]

by adding currentPosition[0] to newPosition[0] I get the new coordinates
in the env array.
same with currentPosition[1] to newPosition[1]

I just have to check to see if I am within the array so I don't go out
of bounds, and to make 
sure I am not running into a wall. For example if env[0][0] is 5
(integer represents wall)
then don't move

James Carnell


-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.python.org/pipermail/tutor/attachments/20070919/0887e406/attachment.htm 


More information about the Tutor mailing list