Python中创建节点时局部变量为何发生变化?
为什么Python里
newstate会跟着state一起变? 嘿,这个问题我刚学Python的时候也踩过坑!本质上是Python对可变对象的引用机制导致的,我给你掰碎了说:
核心原因:可变对象的赋值是「引用传递」
在Python里,数据类型分两种:
- 不可变对象:比如整数(int)、字符串(str)、元组(tuple)——这些东西一旦创建就不能修改内容。
- 可变对象:比如列表(list)、字典(dict)——可以随时添加、删除、修改里面的元素。
你这里的state看起来是个列表(从你给出的结果能看出来是列表结构),属于可变对象。当你执行newstate = state的时候,并没有复制一份新的列表,而是让newstate和state指向了内存里的同一个列表对象。就像两个人共用一把钥匙开同一扇门,不管谁在门里改东西,另一个人开门看到的都是修改后的样子。
举个简单的例子就能明白:
state = [2, 'min'] newstate = state # 修改state state.append((5, 'min')) # 打印newstate,会发现它也变了! print(newstate) # 输出: [2, 'min', (5, 'min')]
怎么解决?创建真正的副本
如果你想让newstate成为独立的新状态,不跟着state变,就得给可变对象做「拷贝」,分两种情况:
1. 浅拷贝(适合单层列表)
如果你的state是单层列表(没有嵌套的可变对象),用这两种方法就行:
- 列表切片:
newstate = state[:] - 用
list()构造函数:newstate = list(state)
2. 深拷贝(适合嵌套的可变结构)
如果你的state里嵌套了其他可变对象(比如列表里还有列表),就得用深拷贝,它会递归复制所有层级的对象:
import copy newstate = copy.deepcopy(state)
在你的minimax算法里,生成新节点时肯定需要独立的状态副本,不然修改新状态的同时会污染原状态,导致算法逻辑混乱,用上面的方法就能解决啦~
内容的提问来源于stack exchange,提问作者vrd.gn
相关产品推荐
相关产品推荐

