考虑:
args = ['-sdfkj']
print args
for arg in args:
print arg.replace("-", '')
arg = arg.replace("-", '')
print args
这会产生:
['-sdfkj']
sdfkj
['-sdfkj']
我期望它['sdfkj']
。
循环中arg
是副本吗?
它表现得就像是一个副本(或者也许是一个不可变的东西,但我希望会抛出一个错误......)
注意:我可以通过列表理解获得正确的行为。我很好奇上述行为的原因。
答案 0 :(得分:8)
循环中的arg是副本吗?
是的,它包含参考文献的副本。
重新分配arg
时,您没有修改原始数组,也没有修改其中的字符串(字符串是不可变的)。您只修改局部变量arg
指向的内容。
Before assignment After assignment
args arg args arg
| | | |
| | | |
(array) / (array) 'sdfkj'
|[0] / |[0]
\ / |
\ / |
'-sdfkj' '-sdfkj'
答案 1 :(得分:1)
既然你在问题中提到你知道可以使用列表推导来完成,我就不会那样向你展示。
正在发生的事情是对每个值的引用被复制到变量arg
中。最初它们都引用相同的变量。重新分配arg
后,它将引用新创建的变量,而列表中的引用保持不变。它与字符串在Python中不可变的事实无关。尝试使用可变类型。
非列表理解方式是修改列表:
for i in xrange(len(args)):
args[i]=args[i].replace('-','')
print args
答案 2 :(得分:0)
如果要修改实际列表,则必须将更改专门分配给列表'args。'
即。
for arg in args:
if arg == "-":
args[arg] = args[arg].replace("-", '')
答案 3 :(得分:0)
我要尝试的列表:
args = [x.replace("-", '') for x in args]