gpt4 book ai didi

python - 在等效多维列表上操作时的不同行为

转载 作者:太空宇宙 更新时间:2023-11-03 16:05:28 25 4
gpt4 key购买 nike

当我对两个等效的多维列表进行操作时,我会得到不同的结果。这些列表之间的唯一区别在于它们的创建方式。我正在使用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
>>>

最佳答案

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]]

将返回对象中的不同实例。我只是指出,这是为了以防万一您不想导入副本或导入任何内容。

关于python - 在等效多维列表上操作时的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39856037/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com