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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:54:57