5

I noticed a (to me) very strange behavior, I don't understand: I got a list and an numpy array both with binary values and I want to check the true positives (both==1 at the same time).

import numpy as np
a = [0,0,1,1]
b = np.array([1,0,1,0])

for a,b in zip(a,b):
  if a==1 and b==1:
      print "cool"
print a,b

Now the craziness begins. a and b are not longer a list or a numpy array but an integer and numpy float? How on earth did that happen? Thanks for your help!

Picard
  • 983
  • 9
  • 23

2 Answers2

18

zip did not change your list. You lost the initial references to your lists when you assigned the name a and b to the loop variables in:

for a, b in zip(a,b):
#   ^  ^

A simple fix is to change those names to say, i and j:

for i, j in zip(a,b):

One thing to bear in mind when using Python is that names are bound to objects, and therefore can be unbound or even rebound. No name is for keeps. Once you change the object a name is referencing like you did, the name starts to reference the new object.

On another note, for loops assign the objects from the iterable to the name(s) provided, similar to a regular assignment, but with repetitions. So the values you get for a and b at the end of the for loop are those of the last assignment done in the last iteration.

Do bear these in mind.

Mad Physicist
  • 107,652
  • 25
  • 181
  • 264
Moses Koledoye
  • 77,341
  • 8
  • 133
  • 139
  • 1
    thank you very much, I forget to choose different loop variables. I didn't know that an assignment takes place in a for loop. I always thought the loop just creates it's own namespace and throws the looping variables away when it has finished. Good to know! – Picard Oct 11 '16 at 14:16
2

Suppose a is a list, and you write a = a[0]. Now you'd expect a to be not a list, but the first value in the list.

Similarly, when you write for a,b in zip(a,b) you re-assign a and b to hold the first element in each iterable. Try:

for x,y in zip(a,b):
  if x==1 and y==1:
      print "cool"
print a,b
mtrw
  • 34,200
  • 7
  • 63
  • 71