需要帮助理解rstrip()方法

fly*_*zai -1 python string python-3.x

我一直在搞乱'\n'清单,这让我很好奇实际发生了什么.

例如,为什么下面的代码不会改变我的列表的值?

numList = ['13\n', '14\n', '15\n']

for x in numList:
    x = x.rstrip('\n')
Run Code Online (Sandbox Code Playgroud)

当我在shell中执行它时会打印出剥离的值,但不会更新numList.但由于某种原因,下面的代码确实改变了我的列表的值:

numList = [x.rstrip() for x in numList]
Run Code Online (Sandbox Code Playgroud)

像下面这样的东西似乎没有任何影响:

for x in numList:
    x.rstrip('\n')
Run Code Online (Sandbox Code Playgroud)

所以基本上,你什么时候可以使用for x in someList:语法,什么时候需要像第二个例子?

Ana*_*mar 7

问题不在于rstrip().使用for循环迭代列表时,如 -

for x in numList:
Run Code Online (Sandbox Code Playgroud)

这里名称x只是对列表中对象的引用,当你这样做时 -

x = x.rstrip('\n')
Run Code Online (Sandbox Code Playgroud)

您只需更改 x为指向不同的字符串对象/引用,您不会更改列表中的引用.如果你想使用for循环更改这样的元素,你应该enumerate在列表上,然后更改该索引处的元素.示例 -

for i, x in enumerate(numList):
    numList[i] = x.rstrip('\n')
Run Code Online (Sandbox Code Playgroud)

虽然在你的情况下,这是不需要的,因为列表理解(你正在做)将是你想要的最佳方法.

另外,当你这样做 -

for x in numList:
    x.rstrip('\n')
Run Code Online (Sandbox Code Playgroud)

它没有改变x,因为字符串在python中是不可变的,x.rstrip('\n')实际上返回一个'\n'从右侧剥离的新字符串对象.

另外,在列表理解中 -

numList = [x.rstrip() for x in numList]
Run Code Online (Sandbox Code Playgroud)

您正在创建一个包含字符串的新列表x.rstrip(),然后您将numList指向该新列表,它没有更改旧列表,因此如果您执行类似的操作 -

oldRef = newList
numList = [x.rstrip() for x in numList]
print(oldRef)
Run Code Online (Sandbox Code Playgroud)

您将能够看到oldRef仍然是相同的,它只是numList现在指向一个新列表.