Python 为什么没有';列表副本上的t操作是否也会修改原始列表中的元素?

Python 为什么没有';列表副本上的t操作是否也会修改原始列表中的元素?,python,list,pointers,reference,copy,Python,List,Pointers,Reference,Copy,在Python中,所有内容都应该用指针表示。因此,我希望下面的代码也会修改原始列表a,因为我认为列表copy将包含a中包含的所有原始指针: import copy a = ["a", "a"] copy = copy.copy(a) for (count, e) in enumerate(copy): copy[count] += "b" print copy print a 我希望看到[“ab”,“ab”]。令人惊讶的是,a仍然只包含[“a”,“a”],而copy确实包含[“a

在Python中,所有内容都应该用指针表示。因此,我希望下面的代码也会修改原始列表
a
,因为我认为列表
copy
将包含
a
中包含的所有原始指针:

import copy

a = ["a", "a"]

copy = copy.copy(a)
for (count, e) in enumerate(copy):
    copy[count] += "b"

print copy
print a
我希望看到
[“ab”,“ab”]
。令人惊讶的是,
a
仍然只包含
[“a”,“a”]
,而
copy
确实包含
[“ab”,“ab”]
。使用
copy=list(a)
也不起作用

我认为只有当我编写
copy=copy.deepcopy(a)
时,这个结果才会发生


我哪里出错了?获取列表中所有元素的引用并在镜像列表中修改它们的正确方法是什么?或者在Python中这是不可能的?

您感到困惑。使用
copy.copy
的全部目的是创建一个新列表,而不引用旧列表。如果确实要保留引用,则不要复制它:

a = ["a", "a"]
copy = a

字符串是不可变的?字符串是不可变的。@chepner比你领先了3秒:PYeah。您没有修改对象。您只需创建新的,并将它们放在新列表中。字符串是不可变的-它们不能被修改。@Zizouz212我宁愿认为我非常快地回答了你的问题:)谢谢。这实际上回答了我的问题。那么在这种情况下,
copy
deepcopy
之间应该有什么区别呢?@JIXiang copy将创建一个新列表,但该列表中的所有元素都是相同的。Deepcopy也将尝试重新创建这些元素。@JIXiang:除非列表中的元素是可变的,否则没有实际的区别,在本例中,它们不是。不正确<代码>删除副本完全删除引用<代码>复制将引用保留在列表中。以列表列表为例:修改已复制列表中的列表仍将修改原始列表的内部列表。这是一个非常实际的区别,我们本质上是在教错误的东西,否则,例如,如果用户最终决定某一天编写Java代码,并使用字符数组而不是字符串。编辑:没有看到@Zizouz212的评论。同样值得注意的是,以下内容也复制了该列表:
li=list(['a','b'))