Рассмотреть:
args = ['-sdfkj']
print args
for arg in args:
print arg.replace("-", '')
arg = arg.replace("-", '')
print args
Это дает:
['-sdfkj']
sdfkj
['-sdfkj']
Где я ожидал, что это будет ['sdfkj']
.
Является ли arg
в цикле копией?
Он ведет себя так, как будто это копия (или, возможно, неизменная вещь, но тогда я ожидаю, что будет выдана ошибка ...)
Примечание: я могу получить правильное поведение с пониманием списка. Мне любопытно относительно причины вышеупомянутого поведения.
4 ответа
Является ли arg в цикле копией?
Да, он содержит копию ссылки.
Когда вы переназначаете arg
, вы не изменяете ни исходный массив, ни строку внутри него (строки неизменяемы). Вы изменяете только то, на что указывает локальная переменная arg
.
Before assignment After assignment
args arg args arg
| | | |
| | | |
(array) / (array) 'sdfkj'
|[0] / |[0]
\ / |
\ / |
'-sdfkj' '-sdfkj'
Для списка я бы попробовал:
args = [x.replace("-", '') for x in args]
Если вы хотите изменить фактический список, вы должны специально назначить изменения в список «args».
Т.е.
for arg in args:
if arg == "-":
args[arg] = args[arg].replace("-", '')
Поскольку вы упоминаете в своем вопросе, что знаете, что это можно сделать с помощью списочных представлений, я не собираюсь вам это показывать.
Там происходит то, что ссылка на каждое значение копируется в переменную arg
. Первоначально они оба ссылаются на одну и ту же переменную. Как только arg
переназначается, он ссылается на вновь созданную переменную, а ссылка в списке остается неизменной. Это не имеет ничего общего с тем фактом, что строки являются неизменяемыми в Python. Попробуйте, используя изменяемые типы.
Путь к пониманию, не относящемуся к списку, заключается в изменении списка на месте:
for i in xrange(len(args)):
args[i]=args[i].replace('-','')
print args
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.