Python操作fill变量为何会修改up、down两个嵌套列表的值?
问题原理解答
核心原因
Python中的列表属于可变对象,变量存储的是列表的内存地址引用,而非列表本身的独立拷贝。
代码行为拆解
- 执行
fill = up时,并没有创建up的副本,只是让变量fill和up绑定到内存中的同一个列表对象,两个变量相当于同一个列表的不同别名。 - 执行
fill[j] += 1时,属于列表的原地修改操作,直接修改的是fill指向的列表对象本身。由于up和fill指向同一个对象,你观察到的up值变化本质是同一个对象被修改,不需要up出现在赋值号左侧。 - 当遇到
.执行fill = down时,只是把fill的绑定关系切换为指向down对应的列表对象,后续fill[j] += 1就会原地修改down指向的列表。
示例验证
以输入第一列的内容# . . # #为例:
- 初始
fill绑定up,第一行匹配#,up[0]加1变为1 - 第二行匹配
.,fill切换绑定到down - 第四行匹配
#,down[0]加1变为1 - 第五行匹配
#,down[0]再加1变为2
最终得到的up[0]=1、down[0]=2和示例输出完全吻合。
认知误区澄清
只有赋值号左侧变量会被修改的逻辑仅适用于不可变对象(整数、字符串、元组等),这类对象无法被原地修改,赋值时只会创建新对象绑定到左侧变量。而可变对象支持原地修改,只要有引用指向该对象,通过任何引用做原地操作都会修改对象本身,所有指向该对象的变量都会同步感知到变化。
内容的提问来源于stack exchange,提问作者randommikrovalna
相关产品推荐
相关产品推荐

