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

Python变量赋值疑问:两段相似代码为何输出结果不同?

为什么两段Python代码输出差异这么大?

这是个非常典型的Python列表赋值陷阱!咱们直奔核心,拆解差异的根源:

核心差异:列表的「引用赋值」vs「独立副本」

两段代码的唯一区别就是key_的赋值方式,这直接决定了后续循环的行为:

  • 代码1:key_=[[0, 0, 0], [1, 0, 0], [0, 1, 1]]
    这里你手动创建了一个全新的二维列表,key和key_是内存中完全独立的两个对象,彼此的修改不会影响对方。
  • 代码2:key_=key
    这是Python里的引用赋值——key_并没有创建新列表,只是和key指向了内存中同一个二维列表对象。说白了,key和key_就是同一个列表的两个“别名”,改其中一个,另一个必然跟着变。

循环中的行为差异

咱们看循环里的操作:key[j_-1][m+1-i_-1]=key_[i_-1][j_-1]

  • 在代码1中,key_是完全独立的原始数据,循环过程中它的值不会被修改,所以每次赋值都是从初始的原始数据里取值,最终得到的是符合预期的变换结果。
  • 在代码2中,循环一开始修改key的元素时,因为key_和key是同一个对象,key_的元素也会同步被修改。后面的循环步骤再去取key_[i_-1][j_-1]时,拿到的已经是被之前步骤修改过的值,不是最初的原始数据了。最终整个列表被反复修改,就出现了和代码1完全不同的结果,而且key和key_输出完全一样——因为它们本来就是同一个东西。

怎么避免这个坑?

如果需要复制列表(尤其是嵌套列表),别直接用=:

  • 对于一维列表,可以用key_ = key.copy()、切片key_ = key[:]或者列表推导式key_ = [x for x in key]创建浅拷贝;
  • 对于二维嵌套列表,需要用深拷贝,比如:
    import copy
    key_ = copy.deepcopy(key)
    
    或者手动逐行复制:
    key_ = [row.copy() for row in key]
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:01:16