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
相关产品推荐
相关产品推荐

