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(

我在Python中对列表进行for循环,据我所知,应该为列表中的每个元素创建一个浅层副本。但是,当我对元素执行操作时,更改不会反映在原始列表中

代码如下:

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对我出错的地方给出了稍微好一点的描述,但这绝对是更干净的解决方案。