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:
语法,什么时候需要像第二个例子?
问题不在于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现在指向一个新列表.