考虑:
args = ['-sdfkj']
print args
for arg in args:
print arg.replace("-", '')
arg = arg.replace("-", '')
print args这产生了:
['-sdfkj']
sdfkj
['-sdfkj']我以为它是['sdfkj']。
循环中的arg是副本吗?
它的行为就好像它是一个副本(或者可能是一个不可变的思想家,但是我希望会抛出一个错误.)
注意:我可以通过理解列表得到正确的行为。我对上述行为的原因感到好奇。
发布于 2010-07-08 17:42:48
是循环中的arg吗?
是的,它包含一份参考资料的副本。
当您重新分配arg时,您没有修改原始数组,也没有修改其中的字符串(字符串是不可变的)。只修改局部变量arg指向的内容。
Before assignment After assignment
args arg args arg
| | | |
| | | |
(array) / (array) 'sdfkj'
|[0] / |[0]
\ / |
\ / |
'-sdfkj' '-sdfkj'发布于 2010-07-08 17:55:03
既然你在你的问题中提到,你知道可以用列表理解来完成,所以我不打算向你展示这种方式。
正在发生的情况是,对每个值的引用被复制到变量arg中。最初,它们都引用相同的变量。重新分配arg后,它引用新创建的变量,而列表中的引用保持不变。这与字符串在Python中是不可变的这一事实无关。尝试使用可变类型。
一种非列表理解的方法是修改列表:
for i in xrange(len(args)):
args[i]=args[i].replace('-','')
print args发布于 2010-07-08 17:56:29
如果要修改实际列表,则必须将更改具体分配给列表'args.‘’。
即
for arg in args:
if arg == "-":
args[arg] = args[arg].replace("-", '')https://stackoverflow.com/questions/3206375
复制相似问题