我一直在搞清楚'\n'
关闭列表,这让我很好奇实际发生了什么。
例如,为什么以下代码不会更改我的列表值?
numList = ['13\n', '14\n', '15\n']
for x in numList:
x = x.rstrip('\n')
当我在shell中执行它时会打印出剥离的值,但不会更新numList。但由于某种原因,下面的代码确实改变了我的列表的值:
numList = [x.rstrip() for x in numList]
下面的内容似乎没有任何影响:
for x in numList:
x.rstrip('\n')
所以基本上,你何时可以使用for x in someList:
语法,何时需要第二个例子?
答案 0 :(得分:7)
问题不在于rstrip()
。当您使用for
循环遍历列表时,为 -
for x in numList:
这里名称x只是对列表中对象的引用,当你这样做时 -
x = x.rstrip('\n')
您只需将x
更改为指向其他字符串对象/引用,就不会更改列表中的引用。如果要使用for
循环更改此类元素,则应在列表上enumerate
,然后更改该索引处的元素。示例 -
for i, x in enumerate(numList):
numList[i] = x.rstrip('\n')
虽然在你的情况下,这不是必需的,因为列表理解(你正在做的)将是你做你想做的最好的方法。
此外,当你这样做时 -
for x in numList:
x.rstrip('\n')
它不会更改x
,因为字符串在python中是不可变的,x.rstrip('\n')
实际上返回一个从右侧剥离'\n'
的新字符串对象。
另外,在列表理解中 -
numList = [x.rstrip() for x in numList]
您正在使用字符串x.rstrip()
创建一个新列表,然后您将numList指向该新列表,它没有更改旧列表,因此如果您执行类似的操作 -
oldRef = newList
numList = [x.rstrip() for x in numList]
print(oldRef)
你可以看到oldRef仍然是相同的,只是numList现在指向一个新列表。