【问题标题】:Update elements of a list更新列表的元素
【发布时间】:2012-10-15 15:11:30
【问题描述】:

为什么没有在 for 循环中更新元素?这让我明白了

met_dir = r'D:\09052012\run\fout'
out_dir = r'D:\inpassingstest\test_cmd'

for c_dir in [met_dir,out_dir]:
    if c_dir[-1:] != '\\':
       c_dir += '\\'
       print c_dir
print met_dir

>>>D:\09052012\run\fout\
>>>D:\inpassingstest\test_cmd\
>>>D:\09052012\run\fout

当我使用索引来寻址元素时,也会发生同样的情况。

【问题讨论】:

    标签: python list updating


    【解决方案1】:

    strings 在 Python 中是不可变的,你不能像那样改变它们的内容。在这一行会发生什么:

    c_dir += '\\'
    

    局部变量c_dir 被替换为一个新字符串(附加了\\)。当您离开循环迭代时,这个新字符串会丢失。

    【讨论】:

      【解决方案2】:

      字符串是不可变的对象,也就是说,你不能改变它,而是创建新的字符串。这意味着当您追加到字符串时,原始内容保持不变。解决此问题的简单方法是列表推导,以创建新字符串的新列表:

      >>> [c_dir + "\\" if not c_dir.endswith("\\") else c_dir for c_dir in (met_dir, out_dir)]
      ['D:\\09052012\\run\\fout\\', 'D:\\inpassingstest\\test_cmd\\']
      

      哪一个可以轻松解压成值:

      met_dir, out_dir = [...]
      

      注意我使用了str.endswith(),这是一种很好的检查方式。

      【讨论】:

      • 是的,str.endswith() 是一个不错的选择。没想到。
      【解决方案3】:

      字符串在 Python 中是不可变的。 c_dir += '\\' 创建一个附加了 \\ 的新字符串,但不会替换原来的字符串。

      【讨论】:

      • 但是使用索引应该可以解决问题,对吧?但事实并非如此。
      • @larsvegas -- 使用索引不起作用。 (字符串不支持对其切片的赋值,因为字符串是不可变的)——换句话说,当你创建一个字符串时,你不能改变它(句点)。您所能做的就是从旧字符串中的数据创建一个新字符串。
      • @larsvegas 不,使用索引没有任何改变。您只能更改您正在迭代的临时列表的内容,但不能更改您存储在met_dirout_dir 中的原始字符串。问题是您永远不会更新这些变量,而且您根本无法就地更改它们指向的对象。
      • @mgilson,我知道。我的意思是通过索引访问元素,如for i in xrange(len(..))。但@millimoose 的评论澄清了这一点。
      • @larsvegas 请注意,在 Python 中按索引访问始终是错误的做法。这不是 Python 的设计方式,也从来不需要它。
      猜你喜欢
      • 2020-05-14
      • 1970-01-01
      • 2016-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-17
      • 2016-02-23
      • 2019-05-15
      相关资源
      最近更新 更多