python循环和字符串的语义

时间:2010-07-08 17:39:05

标签: python semantics

考虑:

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

这会产生:

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

我期望它['sdfkj']

循环中arg是副本吗?

它表现得就像是一个副本(或者也许是一个不可变的东西,但我希望会抛出一个错误......)

注意:我可以通过列表理解获得正确的行为。我很好奇上述行为的原因。

4 个答案:

答案 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]