【问题标题】:Python list Not changing values [duplicate]Python列表不更改值[重复]
【发布时间】:2021-12-26 18:27:48
【问题描述】:
x=[3,6,9,[12]]
y=list(x)
x[3][0]=50
x[1]=25
print(y)

代码的输出是[3, 6, 9, [50]]

为什么 12 变成了 50,而 6 没有变成 25?

【问题讨论】:

  • 好的,所以你必须阅读浅拷贝和深拷贝。制作了一个新列表并将值复制到 y 中,但未制作对 [12] 列表的引用。假设这个列表[12]的变量保存地址不是[12]。因此,创建了一个新变量,其中包含该列表 [12] 的相同地址。由于这种变化,它的值会因为相同的地址引用而改变列表的值,而不是因为它们是深拷贝。
  • y = x 而不是 y = list(x) 给出你想要的行为。
  • 你能让@ShobhitTewari 更清楚一点吗?我不清楚

标签: python


【解决方案1】:

当您执行list(x) 时,python 会复制列表 x 并将其存储在 y 中。因此,如果它是一个所有元素都为整数的列表,例如 -:

x = [1, 2, 3, 4]
y = list(x)
x[0] = 7
print(x, y)

[7, 2, 3, 4] [1, 2, 3, 4]

您会注意到 y 的第 0 个索引没有变化,这是因为整数与列表一起存储和复制。

Python 通常将值存储在不同的内存地址,变量就像指向该地址的指针,因此可以在需要时获取值。[感谢您在问题的 cmets 中指出这一点@ShobitTewari]

因此,例如列表是对存储在内存[1, 2, 3, 4] 中的列表的引用。 但是如果列表中有一个嵌套列表,就像这样 -:[1, 2, [12]] 那么这个内部列表[12] 的值也位于其他一些内存地址,并且索引只是指向该地址。与整数不同,嵌套列表不会与列表的其余部分存储在同一地址。

所以当您执行list(x) 时,python 会将整个列表复制到一个新的内存地址中,该地址位于here 上。但是如果你有一个嵌套列表,那么这些列表的内存地址仍然保持不变。

因此,当您更改该嵌套列表的第 0 个索引的值时,它会在内存中更改它,并且 y 的指针仍指向该旧内存地址,因此嵌套列表的值会更改。

x = [1, 2, 3, [4]]
y = list(x)

x[3][0] = 7
print(x, y)

[1, 2, 3, [7]] [1, 2, 3, [7]]

【讨论】:

    猜你喜欢
    • 2020-02-05
    • 2013-07-15
    • 2015-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多