Python复制一个包含引用副本和值副本的列表

Python复制一个包含引用副本和值副本的列表,python,Python,我试图创建两个列表a和b a和b应满足以下条件: len(a) == len(b) == 5 a == b a is not b a[0] is b[0] a[1] is not b[1] a[2] is b[2] a[3] is not b[3] a[4] is b[4] 我试着用 b = copy.deepcopy(a) 但它没有通过 a[1] is not b[1] and a[3] is not b[3] 有人能帮我吗?这可能不是你想要的答案,但至少能帮助你理解这个概念。数值相同,

我试图创建两个列表a和b

a和b应满足以下条件:

len(a) == len(b) == 5
a == b
a is not b
a[0] is b[0]
a[1] is not b[1]
a[2] is b[2]
a[3] is not b[3]
a[4] is b[4]
我试着用

b = copy.deepcopy(a)
但它没有通过

a[1] is not b[1]
and
a[3] is not b[3]

有人能帮我吗?

这可能不是你想要的答案,但至少能帮助你理解这个概念。数值相同,但指数1和3中的元素因参考而不同。希望这有帮助

import copy

avalues = [(1,1),(2,4),(3,9),(4,16),(5,25)]
bvalues = [(1,1),(2,4),(3,9),(4,16),(5,25)]
a = [avalues[0],avalues[1],avalues[2],avalues[3],avalues[4]]
b = [avalues[0],bvalues[1],avalues[2],bvalues[3],avalues[4]]

print "len(a) == 5:", len(a) == 5
print "len(a) == len(b):", len(a) == len(b)
print "a == b:", a == b
print "a is not b:", a is not b
print "a[0] is b[0]:", a[0] is b[0]
print "a[1] is not b[1]:", a[1] is not b[1]
print "a[2] is b[2]:", a[2] is b[2]
print "a[3] is not b[3]:", a[3] is not b[3]
print "a[4] is b[4]:", a[4] is b[4]

以下是一种可行的方法:

a = [0, [1], 2, [3], 4]

b = copy.deepcopy(a)
这是因为
deepcopy
插入以下内容之一:

  • 对于不可变对象(如
    int
    str
    ),对同一对象的引用(共享相等标识);或
  • 对于可变对象(如
    列表
    ),对对象(深度)副本的引用(共享相等,但不共享标识)
进入新对象

演示:

>>> from copy import deepcopy
>>> a = [0, [1], 2, [3], 4]
>>> b = deepcopy(a)
>>> print a == b, a is b
True False
>>> for a_i, b_i in zip(a, b):
    print a_i == b_i, a_i is b_i


True True
True False
True True
True False
True True

请举两个满足您条件的列表的例子好吗?您的条件自相矛盾,只要deepcopy(),a==b就会失败。最好解释一下你为什么需要这个。对不起,我不能,这就是我得到的所有信息。你是给了
a
b
中的一个,然后需要构建另一个,还是只需要两个这样的列表就行了?你为什么要这么做呢?这是对你理解Python的测试吗?好吧,想想
a==b
a
b
的相应元素意味着什么,试着想想你可以使用什么类型的对象来
a[1]
b[1]
这样
a[1]==b[1]
但是
a[1]不是b[1]
。虽然我很少推荐使用它,但是使用
eval
的循环可以简化这里的代码@我同意。这里的目的是以可读的方式向Blaaaakuu解释这个概念。对于生产代码,我不会这样写。谢谢!非常感谢