【问题标题】:Semantics of python loops and stringspython循环和字符串的语义
【发布时间】:2011-03-13 11:48:40
【问题描述】:

考虑:

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

这会产生:

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

我希望它是['sdfkj']

循环中的arg 是副本吗?

它的行为就好像它是一个副本(或者可能是一个不可变的东西,但我预计会抛出一个错误......)

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

【问题讨论】:

    标签: python semantics


    【解决方案1】:

    对于我想尝试的列表:

    args = [x.replace("-", '') for x in args]
    

    【讨论】:

      【解决方案2】:

      如果您想修改实际列表,您必须将更改专门分配给列表“args”。

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

      【讨论】:

      • 除非 args 是字典,否则这将不起作用。假设它是一个列表,您正在尝试将该值用作索引,但这是行不通的。另一方面,如果 args 是字典,则此方法有效,因为您将循环遍历键,并获得预期的行为。
      【解决方案3】:

      循环中的 arg 是副本吗?

      是的,它包含参考的副本。

      当您重新分配arg 时,您不会修改原始数组,也不会修改其中的字符串(字符串是不可变的)。您只修改局部变量arg 指向的内容。

      Before assignment         After assignment
      
      args          arg          args          arg
        |            |            |            |
        |            |            |            |
      (array)        /          (array)       'sdfkj'
        |[0]        /             |[0]        
         \         /              |
          \       /               |
           '-sdfkj'            '-sdfkj'
      

      【讨论】:

      • 是否有语法表明我想对引用本身进行操作?
      • @Paul Nathan:不。如果您有对数组的引用而不是内容,那么您可以直接修改数组args[i] = args[i].replace("-", '')。因此,您可以例如使用 enumerate 遍历索引。
      【解决方案4】:

      由于您在问题中提到您知道可以使用列表推导来完成,所以我不会向您展示这种方式。

      那里发生的情况是,对每个值的引用被复制到变量arg 中。最初,它们都引用同一个变量。一旦arg 被重新分配,它引用新创建的变量,而列表中的引用保持不变。这与字符串在 Python 中不可变这一事实无关。尝试使用可变类型。

      一种非列表理解方式是修改列表:

      for i in xrange(len(args)):
          args[i]=args[i].replace('-','')
      print args
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-03-17
        • 1970-01-01
        • 2021-06-13
        • 2021-03-22
        • 2013-11-23
        • 2017-12-18
        • 2015-03-25
        相关资源
        最近更新 更多