python中的For循环不';不操纵原始对象,而是执行深度复制
我在Python中对列表进行for循环,据我所知,应该为列表中的每个元素创建一个浅层副本。但是,当我对元素执行操作时,更改不会反映在原始列表中 代码如下:python中的For循环不';不操纵原始对象,而是执行深度复制,python,python-3.x,for-loop,shallow-copy,Python,Python 3.x,For Loop,Shallow Copy,我在Python中对列表进行for循环,据我所知,应该为列表中的每个元素创建一个浅层副本。但是,当我对元素执行操作时,更改不会反映在原始列表中 代码如下: interactions = f.readlines() for interaction in interactions: orig = interaction interaction = interaction.replace('.', '').replace(' ', '').strip('\n') if len(
interactions = f.readlines()
for interaction in interactions:
orig = interaction
interaction = interaction.replace('.', '').replace(' ', '').strip('\n')
if len(interaction) == 0:
interactions.remove(orig)
print(interactions)
给定['.Bph\n',心血管疾病\n',糖尿病\n','...]
的初始列表,此操作的输出为:
['. Bph\n', 'Cardiovascular\n', 'Diabetes\n', '. ']
['. Bph\n', 'Cardiovascular\n', 'Diabetes\n', '. ']
['. Bph\n', 'Cardiovascular\n', 'Diabetes\n', '. ']
['. Bph\n', 'Cardiovascular\n', 'Diabetes\n']
即使当我跟随调试器时,我可以看到对
交互执行的正确操作,但是这些更改并没有反映在交互中。我在这里做错了什么?为什么要反映出来?您正在修改str
元素,但它们无法进行适当的更改,因此将返回包含更改值的新字符串;原始列表中未反映任何内容。:-)
相反,您应该迭代一个交互[:]
副本,并使用索引枚举
生成:
for i, interaction in enumerate(interactions[:]):
# redundant in this snippet
orig = interaction
# strip() will remove '\n' and leading-trailing ' '
interaction = interaction.replace('.', '').replace(' ', '').strip('\n')
# if interaction: suffices
if len(interaction) == 0:
interactions.remove(orig)
else:
interactions[i] = interaction
print(interactions)
现在,这将提供以下输出:
['Bph', 'Cardiovascular\n', 'Diabetes\n', '. ']
['Bph', 'Cardiovascular', 'Diabetes\n', '. ']
['Bph', 'Cardiovascular', 'Diabetes', '. ']
['Bph', 'Cardiovascular', 'Diabetes']
Python字符串是不可变的,所以您需要用清理过的版本替换每个元素(使用Jim答案中的索引),或者建立一个新列表。IMO最简单的方法是通过列表理解:
interactions = [i.replace('.', '').replace(' ', '').strip('\n') for i in interactions]
interactions = list(filter(None, interactions)) # Remove empty elements
Jim的回答相当完美,但请记住,尽管Python确实在赋值时执行浅层复制,str
对象是不可变的,因此没有任何str
方法会在适当的位置修改对象。Jim对我出错的地方给出了稍微好一点的描述,但这绝对是更干净的解决方案。