2013-03-12 3 views
3

Вот несколько списков: a, b и т. Д. Я хочу внести их некоторые изменения соответственно, но меня путают с поведением цикла for.в python Какова связь между переменной цикла и элементами в списке, когда мы делаем для цикла?

, например: если мы

a, b = range(5), range(5,10) 
for x in [a, b]: x += [0] 
print(a,b) 

мы получаем

([0, 1, 2, 3, 4, 0], [5, 6, 7, 8, 9, 0]) 

а, Ь модифицированную.

но если мы делаем

a, b = range(5), range(5,10) 
for x in [a, b]: x = x + [0] 
print(a,b) 

мы получаем

([0, 1, 2, 3, 4], [5, 6, 7, 8, 9]) 

а, б не изменяются. Я смущен, какова связь между x и a? Когда и как я могу изменить значение a с x? И кстати, в чем разница между a = = b и a = a + b?

Во всяком случае, я найти решение, которое мы можем сделать, как это

a, b = range(5), range(5,10) 
lis = [a, b] 
for i, x in enumerate(lis): 
    lis[i] = ... 

, то мы можем изменить значение в & б. Но для этого метода нужен дополнительный список.

И есть пыльники решения

for x in ['a', 'b']: 
    exec(x + '=' + x + '+ ...') 

И простое решение

a, b = range(5), range(5,10) 
for x in [a, b]: x[:] = x + [0] 
print(a,b) 

Мы найдем а, Ь модифицируют :)

ответ

7

Отношения такого же, как со всеми переменными связываниями в Python. Имя привязано к значению. Различия, которые вы видите, - это то, что вы делаете разные вещи, иногда, действуя по значению, а иногда и по имени.

Для списков += расширяет список на месте --- то есть он изменяет исходный список. Таким образом, модификации видны везде, где используется список.

Когда вы делаете x = x + [0], вы перепечатываете имя x в новый список (сформированный путем добавления старого списка плюс [0]). Это не изменяет исходный список, поэтому в других местах, которые используют этот список, это изменение не будет видно.

Если вы ищете для вопросов Python «переменные», «имена», «значения», «вызов по ссылке» и т. Д., Вы найдете другие обсуждения этого вопроса. Here - вопрос, связанный с аналогичной проблемой в контексте привязки функциональных параметров. Принципы одинаковы для привязки переменных for-loop.

+0

См. Этот [связанный ответ] (http://stackoverflow.com/a/2022044/1988505), объясняющий больше о создании нового списка путем добавления к нему или вставке в исходный список. –

+0

Большое спасибо за ваш ответ, теперь он намного яснее. Кажется, что я должен узнать больше основ о python :) –

3

Линия:

x += something 

изменяет список на месте, в то время как:

x = x + something 

создает новый список, присоединившись x и something.

Это ничем не отличается от следующей упрощенной демонстрации:

>>> a = [7]  # The object is [7], name a is connected to it. 
>>> x = a  # Now name x is also connected. 
>>> x += [2]  # Here we change the backing object (behind a AND x). 
>>> a   # So that both names seem to change. 
[7, 2] 
>>> x 
[7, 2] 

>>> a = [7]  # The object is [7], name a is connected to it. 
>>> x = a  # Now name x is also connected. 
>>> x = x + [2] # Here we create a NEW object from the old one, and connect x. 
>>> a   # So a is unchanged. 
[7] 
>>> x   # But x IS changed. 
[7, 2] 

Это была самая трудная вещь, которую я должен был привыкнуть в Python, тот факт, что имена и объекты, имена относятся к совершенно несоизмеримы , и часто могут действовать удивительными способами. Это также одна из ее самых прекрасных функций, когда вы ее обманываете.

В конце концов я только начал думать, что имена были указателями C, и все объекты были на куче (так как именно там у меня был свой опыт). Там могут быть лучшие способы думать об этом, хотя я никогда не нашел для меня ничего.

+0

Вы правы, имена и объекты разные. Имена похожи на * ярлыки * накладываются на объект; присвоение метки объекту выполняется с помощью 'name = ...' (это называется связыванием объекта с именем). Один объект может иметь много ярлыков (например, при создании 'name2 = name'). Трудность состоит в том, что 'name' представляет метку в' name = ... ', но * object * в' name2 = name' (или 'name + = [0]'). – EOL

+0

Итак, список похож на массив в C, мы можем использовать срез для изменения значения. Ах, я нахожу другое решение, для x в [a, b]: x [:] = x + [0], python - intersting. –

Смежные вопросы