鱼C论坛

 找回密码
 立即注册
查看: 2922|回复: 0

[技术交流] Python FAQ 018 列表无缘无故变了

[复制链接]
发表于 2020-3-5 13:29:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Python FAQ 018 列表无缘无故变了


问题

我想让列表 a 改变,为什么列表 b 无缘无故变了 ?

  1. >>> a = [1, 2, 3]
  2. >>> b = a
  3. >>> a.append(4)
  4. >>> a
  5. [1, 2, 3, 4]
  6. >>> b    # 为什么 b 也变了?不明白
  7. [1, 2, 3, 4]
复制代码


解答

问题出在 b = a 这一句上。

给变量赋值就好比贴标签。a 标签贴在了列表 [1, 2, 3] 上,b = a 相当于把 b 标签贴在了和 a 一样的列表。

这时 b 和 a 指向的都是同一个列表 [1, 2, 3],它们的内存地址都一样:

  1. >>> id(a)    # id() 函数用于查看变量的内存地址
  2. 1775624591424
  3. >>> id(b)
  4. 1775624591424
复制代码


所以要想 a 和 b 两个标签 “分道扬镳”,需要将 a 指向的列表拷贝一份给 b,像这样:

  1. >>> a = [1, 2, 3]
  2. >>> b = a[:]    # 拷贝列表
复制代码


这样 a 和 b 就没有关系了(内存地址不同):

  1. >>> id(a)
  2. 1638823234944
  3. >>> id(b)
  4. 1638829077504
复制代码


再试一遍,不会出现上面问题的情况了:

  1. >>> a = [1, 2, 3]
  2. >>> b = a[:]
  3. >>> a.append(4)
  4. >>> a
  5. [1, 2, 3, 4]
  6. >>> b
  7. [1, 2, 3]
复制代码

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-1 11:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表