当我操作两个时,我认为等效的多维列表,我有不同的结果。列表之间的唯一区别是它们是如何创建的。我正在使用Python 3.4.3
>>> b = [[1,2],[1,2]]
>>> b[0][0] += 1
>>> b
[[2, 2], [1, 2]]
>>> b = [[1,2]] * 2
>>> b
[[1, 2], [1, 2]]
>>> b[0][0] += 1
>>> b
[[2, 2], [2, 2]]
正如你所看到的,b和它们的操作是相同的,但结果却不是。我猜它与它们的创建方式有关,因为这是唯一的区别,但我不知道如何。
与Python 2.7.6相同
>>> b = [[1,2],[1,2]]
>>> b
[[1, 2], [1, 2]]
>>> c = [[1,2]] * 2
>>> c
[[1, 2], [1, 2]]
>>> c == b
True
>>> b[0][0] += 1
>>> b
[[2, 2], [1, 2]]
>>> c[0][0] += 1
>>> c
[[2, 2], [2, 2]]
>>> c == b
False
>>>
答案 0 :(得分:1)
b = [[1,2],[1,2]]
print(id(b[0])) # 139948012160968
print(id(b[1])) # 139948011731400
b = [[1,2]]*2
print(id(b[0])) # 139948012161032
print(id(b[1])) # 139948012161032
`id() shows the object's ID or the memory location in Python.
执行b = [[1,2]]*2
时,您基本上是说让我们指向同一个对象两次并将其存储在列表中的b中。
当你执行b = [[1,2],[1,2]]
时,你基本上是说让我得到两个不同的对象并将它们放在一个列表中,然后让b引用该列表。
因此对于后一个示例,当然您将获得该输出,因为它们与您正在更改的对象相同。你可以把它想象成我给你一个房子的相同地址,我有同样的地址,我给你。我们最终在同一个地方,我们对房子做了什么改变,我们一起看到它。
编辑评论:
正确!它们正在改变内存的处理方式,但值是相同的。
==
测试值是否相同。 is
测试对象是否相同。所以在我们的案例中:
#First case:
print(b[0] == b[1]) #true
print(b[0] is b[1]) #false
#second case:
print(b[0] == b[1]) #true
print(b[0] is b[1]) #true
第二次编辑第二次评论!〜
import copy
x = [1,2]
b = [copy.copy(x) for i in range(3)]
print(id(b[0])) #140133864442248
print(id(b[1])) #140133864586120
print(id(b[2])) #140133864568008
print(b) #[[1, 2], [1, 2], [1, 2]] you can extend range to 256.
如果您想要一个唯一的对象并想要从另一个对象复制它,请尝试使用copy。它创建一个具有相同值的新对象。
使用我最喜欢的函数sum
再次编辑:
这或多或少是多余的,可能会让您更加困惑,但sum
也可以。
x = [1,2]
b = [sum([x],[]) for i in range(3)]
print(id(b[0])) #140692560200008
print(id(b[1])) #140692559012744
print(b) #[[1, 2], [1, 2], [1, 2]]
将返回对象中的不同实例。我只是指出这是为了防止您不想导入副本或导入任何内容。
答案 1 :(得分:0)
这是Python中非常好理解的行为。
a = [[], []] # two separate references to two separate lists
b = [] * 2 # two references to the same list object
a[0].append(1) # does not affect a[1]
b[0].append(1) # affects b[0] and b[1]
答案 2 :(得分:0)
在第二种情况下,您正在制作[1,2]
列表的浅层副本。基本上这意味着内存中的某个地方有列表[1,2]
,当你写[[1,2]]*2
时,你说你想要两个引用同一个列表。因此,当您更改其中一个列表时,您实际上正在更改b
中的两个项目所指的列表。