[Tutor] list question

Dave Angel davea at ieee.org
Tue Aug 11 16:07:41 CEST 2009


Wayne wrote:
> On Tue, Aug 11, 2009 at 7:17 AM, <proportional at msn.com> wrote:
>
>   
>>  hi i am currently doing the 'livewires' python tutorial lesson 5. i am
>> making a little game that makes a few squares chase a circle around a little
>> grid. i can get the 1 square acting on 1 variable to come up, but the
>> tutorial now wants me to create a list of variables that act under the same
>> class.
>>
>> this is what i have to make the 1 square appear (which works)(i have also
>> cut a lot of the program out to make this email smaller.)
>>
>> class Robot:
>>     pass
>>
>> def place_robot():
>>     global robot
>>     robot = Robot()
>>     robot.x=random_between(0,63)
>>     robot.y=random_between(0,47)
>>     draw_robot()
>>     print robot.x
>>
>> and i cant figure out what to write to make the variable 'robot' work as a
>> list, and then follow all the instructions 3 times. this is what i tried to
>> put in.
>>
>> class Robot:
>>     pass
>>
>> def place_robot():
>>     global robot
>>     r1 = Robot()
>>     r2 = Robot()
>>     r3 = Robot()
>>     robot = [r1,r2,r3]
>>     robot.x=random_between(0,63)
>>     robot.y=random_between(0,47)
>>     draw_robot()
>>     print robot.x
>>
>> i was under the assumption that the instruction
>> robot.x=random_between(0,63) would return a value 3 times for r1 r2 and r3,
>> but instead i get AttributeError: 'list' object has no attribute 'x'. so i
>> got no idea heh. i hope this makes sense, as im really new to programming.
>>
>>     
>
> I think what you want is:
>
> for r in robot:
>     r.x = random_between(0,63)
>     r.y = random_between(0,47)
>     draw_robot()
>     print r.x
>
> Now for the why:
> robot is a list of objects - you declared it such with robot = [r1, r2, r3]
> (incidentally you could just do robots = [Robot(), Robot(), Robot()] ), and
> lists don't have x y attributes, which you're trying to access. I presume
> you're really trying to access the x y attributes of your Robot() class,
> which is an entirely different object from your list.
>
> HTH,
> Wayne
>
>   
This illustrates the danger of global variables.  The draw_robot() 
function probably accesses the global variable robot, which has now 
changed its meaning.  So probably it should be a method of the Robot 
class, in which case you'd use
         r.draw_robot()

Alternatively, if it must be a function rather than a method, you should 
add a parameter to it, and call it as
        draw_robot(r)

If this were my code, I'd probably have created a new global variable  
robots, indicating that it's now a list.  And change the function 
place_robot() to place_robots().

DaveA



More information about the Tutor mailing list