2016-10-11 1 views
2

Я заметил (мне) очень странное поведение, я не понимаю: У меня есть список и массив numpy с двоичными значениями, и я хочу проверить истинные положительные значения (оба == 1 в то же время) ,Почему zip меняет мои списки?

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 

Теперь начинается сумасшествие. a и b больше не являются списком или массивом numpy, а целочисленным и numpy float? Как это произошло? Спасибо за помощь!

ответ

15

zip не изменил ваш список. Вы потеряли первоначальные ссылки на списки, когда вы назначили имя a и b к переменным цикла в:

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

Простое исправление, чтобы изменить эти имена, чтобы сказать, i и j:

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

При использовании Python следует иметь в виду, что имена привязаны к объектам и поэтому могут быть unbound или даже отскок. Нет имени для сохранения. После изменения объекта имя ссылается так, как вы это делали, имя начинает ссылаться на новый объект.

В другом примечании петли for присваивают объекты из итерабельности указанным именам, аналогичным регулярному назначению, но с повторениями. Таким образом, значения, которые вы получаете для a и b в конце цикла for, являются значениями последнего назначения, выполненного в последней итерации.

Имейте это в виду.

+1

большое спасибо, я забыл выбрать разные переменные цикла. Я не знал, что назначение происходит в цикле for. Я всегда думал, что цикл просто создает собственное пространство имен и сбрасывает переменные цикла, когда он закончил. Хорошо знать! – Pepe

2

Предположим, что a - это список, и вы пишете a = a[0]. Теперь вы ожидаете, что a не будет списком, а первым значением в списке.

Аналогичным образом, когда вы пишете for a,b in zip(a,b), вы назначаете a и b для хранения первого элемента в каждом итерабельном. Попытка:

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