Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么不';t修改字符串列表_Python - Fatal编程技术网

Python 为什么不';t修改字符串列表

Python 为什么不';t修改字符串列表,python,Python,为什么rstrip不修改名为instrumentList的字符串列表 for instrument in instrumentList: instrument = instrument.rstrip() 您正在重新定义本地仪器,而不是更改列表中的值 尝试: 在Python中,str是不可变的;您不能在适当的位置更改它。您可以通过id看到这一点(相同的id表示相同的对象): rstrip返回一个新的str对象,将其分配给instrument不会改变instrument引用的对象所在的列表

为什么rstrip不修改名为instrumentList的字符串列表

for instrument in instrumentList:
    instrument = instrument.rstrip()

您正在重新定义本地
仪器
,而不是更改列表中的值

尝试:


在Python中,
str
是不可变的;您不能在适当的位置更改它。您可以通过
id
看到这一点(相同的
id
表示相同的对象):

rstrip
返回一个新的
str
对象,将其分配给
instrument
不会改变
instrument
引用的对象所在的列表;列表仍然引用旧对象:

>>> instruments = ["guitar "]
>>> id(instruments[0])
50103968
>>> instrument = instruments[0]
>>> instrument = instrument.rstrip()
>>> id(instrument)
49968576 # different object
>>> id(instruments[0])
50103968 # still the same in list
列表是可变的,因此如果您有一个对象列表,您可以就地更改它,即不创建新对象,例如通过添加新项:

>>> instruments = ["guitar"]
>>> id(instruments)
50116048
>>> instruments.append("piano")
>>> instruments
['guitar', 'piano'] # more items
>>> id(instruments)
50116048 # same object
或者(这是您想要做的),更改特定索引引用的对象:

for index, instrument in enumerate(instruments):
    instruments[index] = instrument.rstrip() # assign new object back into list

尽管ramcdougal对列表的理解肯定更为简洁。

Jornsharpe的回答非常好,但我只想指出另一种使用
地图的简明方法:

from string import rstrip
instruments_stripped = map(rstrip, instruments)

与列表理解一样,这将创建一个新列表。

严格来说,我正在构建一个替换列表,而不是修改您原来的列表。在适当的位置更改列表会更节省内存,但只有当您拥有数亿台仪器时,这才真正成为一个问题。在同一主题上,如果有其他东西引用了该列表,因此您必须在适当的位置修改该列表,那么最简单的更改就是
instrumentList[:]=[相同的替换列表]
。jonrsharpe的代码不必构造第二个大列表,因此可能有利于内存使用。但它确实使用了索引,因此代码的可读性稍差。请注意,这将在Python3.x中创建一个
映射
对象,而不是
列表
@jonrsharpe:不,因为字符串导入rstrip中的
将在Python中失败3;-)@SteveJessop很好的观点!在3.x中,使用
列表(map(str.rstrip,instruments))
(见鬼,因为这在2.x中会起作用,也许总是使用它)。
for index, instrument in enumerate(instruments):
    instruments[index] = instrument.rstrip() # assign new object back into list
from string import rstrip
instruments_stripped = map(rstrip, instruments)