You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何列表ones在无关代码块执行后值发生变化?

为什么修改twos里的列表会影响terms?

这事儿说穿了就是Python里可变对象的引用机制在搞鬼,我当初刚学Python的时候也踩过这个坑,给你掰扯清楚:

问题核心:列表是可变对象,append的是引用而非副本

在Python中,像列表这种可变对象,当你把它添加到另一个列表里(比如terms.append(ones)或者twos.append(ones)),你并没有复制一份ones的内容存进去,而是把指向ones这个列表在内存中位置的“指针”(也就是引用)加了进去。

看你的代码流程:

  • 初始化ones = [],然后循环3次每次给ones加个1,同时每次都把ones的引用添加到terms里。所以terms里的3个元素,其实全都是指向同一个ones列表的引用——到循环结束时,ones变成了[1,1,1],所以terms里的每个元素看起来都是[1,1,1]。
  • 后面你把ones的引用添加到twos里,然后修改twos[-1](本质就是修改那个引用指向的ones列表):弹出最后一个元素再改成2,这直接修改了内存里那个唯一的列表对象。
  • 而terms里的所有元素都是指向这个对象的引用,所以自然terms的内容也跟着变了。

怎么解决?

如果你想让terms里的每个元素都是独立的列表,而不是同一个引用,每次append的时候要传ones的副本,而不是原列表的引用。可以用这几种方式:

  • terms.append(ones.copy())
  • terms.append(list(ones))
  • terms.append(ones[:])

这样每次添加到terms里的都是一个新的列表,修改原ones或者其他列表都不会影响它们了。

内容的提问来源于stack exchange,提问作者HelloWorld4444

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:50:44