Рассмотреть:

args = ['-sdfkj']
print args
for arg in args:
    print arg.replace("-", '')
    arg = arg.replace("-", '')
print args

Это дает:

['-sdfkj']
sdfkj
['-sdfkj']

Где я ожидал, что это будет ['sdfkj'].

Является ли arg в цикле копией?

Он ведет себя так, как будто это копия (или, возможно, неизменная вещь, но тогда я ожидаю, что будет выдана ошибка ...)

Примечание: я могу получить правильное поведение с пониманием списка. Мне любопытно относительно причины вышеупомянутого поведения.

2
Paul Nathan 8 Июл 2010 в 21:39

4 ответа

Лучший ответ

Является ли arg в цикле копией?

Да, он содержит копию ссылки.

Когда вы переназначаете arg, вы не изменяете ни исходный массив, ни строку внутри него (строки неизменяемы). Вы изменяете только то, на что указывает локальная переменная arg.

Before assignment         After assignment

args          arg          args          arg
  |            |            |            |
  |            |            |            |
(array)        /          (array)       'sdfkj'
  |[0]        /             |[0]        
   \         /              |
    \       /               |
     '-sdfkj'            '-sdfkj'
8
Mark Byers 8 Июл 2010 в 17:55

Для списка я бы попробовал:

args = [x.replace("-", '') for x in args]
0
Chris Hulan 8 Июл 2010 в 17:59

Если вы хотите изменить фактический список, вы должны специально назначить изменения в список «args».

Т.е.

for arg in args:
    if arg == "-":
        args[arg] = args[arg].replace("-", '')
0
Justin Hamilton 8 Июл 2010 в 17:56

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

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

Путь к пониманию, не относящемуся к списку, заключается в изменении списка на месте:

for i in xrange(len(args)):
    args[i]=args[i].replace('-','')
print args
1
MAK 8 Июл 2010 в 17:55