【问题标题】:Python List assignment seems like it gets carried away [duplicate]Python列表分配似乎被带走了[重复]
【发布时间】:2020-02-15 18:27:30
【问题描述】:
a=[1] # here is a comment to the right
print("as expected, a=", a)

b=a
print("as expected, b=", b)


a[0]=2

print("as expected, now a=", a)


print("NOT EXPECTED TO CHANGE now b=", b)

【问题讨论】:

  • 很糟糕,stackoverflow 不允许我在每行旁边输入 cmets....
  • @Bella 你当然可以把 c​​mets 放在每一行旁边……不知道你的意思
  • 我将 a 列表的值从 1 更改为 2,它确实发生了变化。但是我没有更改 b 列表的值,但是,它似乎也更改为 2 ......这怎么可能?
  • LeoE,你能解释一下吗?我真的不明白....
  • 首先我在这里输入了这一行代码 a=[1] # a 现在是 [1] 即我在每个右侧输入了 cmets,但系统一直告诉我它不能将其发布为是的,它的格式不正确......代码是正确的,我们可以在右边有 cmets......

标签: python list variable-assignment


【解决方案1】:

列表是可变的... a 和 b 都指向同一个列表,所以改变 a 也会改变 b

如果您不希望这种行为将 a 的副本分配给 b

b = a[:]

如果您在更改时使用了不可变数据类型(如字符串或数字),它会将一个全新的变量分配给 b 并且可以工作......但可变数据类型不会像这样工作

【讨论】:

  • 您能否详细说明“a 和 b 都指向同一个列表”?那个怎么样?此外,列表是可变的这一事实可能与此无关,对吧?
  • 你是说当我们输入 b=a 时 b 指向与 a 相同的内存? b没有自己的记忆吗?
  • @Bella as for "both a and b point to the same list" - 在pythontutor.com 上运行您的代码,您将看到这是从ab 指向同一元素的箭头。
  • 是的,它们都指向内存中的同一个列表。 .. 所有 B 和 A 都是指针(即,它是指向实际列表的内存位置的地址(检查 a is b
  • @furas 我确实在 pythontutor.com 中运行过它并看到了箭头,非常有启发性......非常感谢,我很感激。
【解决方案2】:

在 python 中(与许多语言一样,C/C++ 除外),名称是对值的引用。当您编写a = b 时,您使a 引用与b 相同的值,您不会复制其内容。

使用b = list(a) 创建副本(或查看deepcopy 了解更复杂的对象)

【讨论】:

  • 你是说 b=a 从现在开始永远指向与 a 相同的位置吗?如何将 a 的内容分配为唯一,而不是使其指向同一位置?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-13
  • 2013-09-12
  • 1970-01-01
  • 2021-10-28
  • 2016-09-30
  • 2012-03-11
相关资源
最近更新 更多