news 2026/10/20 6:25:05

动态环境下多无人机协同路径规划与防撞Matlab实现方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
动态环境下多无人机协同路径规划与防撞Matlab实现方案

动态环境下多无人机协同路径规划与防撞,这套Matlab方案我是这么落地实现的

多无人机协同路径规划与防撞,前两年还是实验室里的前沿课题,现在几乎成了无人机应用落地的必答题。无论是物流配送、农业巡检还是编队表演,凡是涉及“多机同场”的场景,都绕不开路径规划和防撞这两个核心问题。我在这块断断续续做过几个项目,最近重新整理了一套基于Matlab的实现方案,专门针对动态环境(也就是障碍物会动、目标点会变、甚至是多无人机之间彼此互为障碍物的场景),今天把整个研究思路、代码架构和踩过的坑一次性说清楚。

这套方案适合谁?如果你刚接触多智能体协同,或者在读论文时对“动态环境下的协同路径规划”这个概念一头雾水,再或者你已经写好了单机路径规划但不知道怎么扩展到多机,这篇文章都能给你一个可以直接上手的参考。实现层面不用C++,也不用ROS,纯粹Matlab就能把核心逻辑跑通,可视化调试也非常方便。

1. 动态环境下多无人机协同路径规划的整体设计思路

1.1 为什么“动态环境”是绕不开的关键词

很多入门教程教的是静态路径规划:障碍物位置固定,目标点位置固定,无人机按规划好的路线飞就行。但真实场景没有这么友好——障碍物可能是在移动的,比如车辆、行人和飞鸟;其他无人机本身也在动;甚至任务目标都可能中途改变。动态环境的核心难点在于一个“变化”的词:第一次规划出的路径,第二次可能就不可用了,因此系统必须具备实时重规划能力。

我在实际项目中感触最深的一点是:所谓“协同”,并不是简单地把多架无人机各自规划好的路径拼在一起,而是要处理路径之间的耦合关系。举个简单例子,两架无人机同时飞向同一个任务区域,如果各自按最短路径规划,大概率会在中间某个位置相遇,此时必须有机制让其中一架让路,或者双方共同调整轨迹。这就是协同路径规划要解决的本质问题,而防撞是协同的下层约束。

1.2 协同规划的核心架构:集中式还是分布式

在设计这套Matlab方案时,我首先面临架构选择:集中式还是分布式。

集中式的思路是所有无人机的状态汇总到地面站,地面站统一规划出所有无人机的轨迹,再下发执行。优点是全局最优性好,但问题在于计算量随无人机数量呈指数增长,而且对通信依赖极强,地面站一旦失效全盘瘫痪。

分布式相反,每架无人机独立计算自己的路径,通过通信或其他无人机的位置信息达成协同。扩展性好,鲁棒性强,但容易出现局部最优,多机之间的协调也需要额外策略。

这套实现方案我选的是“集中规划+分布式避障”的混合架构:任务分配和目标点规划集中在主控制器完成,而实时防撞交给每架无人机的局部逻辑。这样既保证了整体协同的效率,又能在动态环境中快速响应突发障碍。对于中小规模无人机编队(10架以内),这个架构在Matlab里跑起来性能完全能接受。

1.3 模块划分与数据流设计

整套代码我按功能拆成四个模块:环境建模模块、路径规划模块、防撞决策模块和可视化模块。数据流是这样的:环境模块负责维护静态障碍物和动态障碍物的实时位置;路径规划模块根据当前环境为每架无人机生成参考路径;防撞决策模块检测参考路径与障碍物或其他无人机是否冲突,若有冲突则触发局部重规划;可视化模块做实时渲染,把仿真过程展示出来。

模块化带来的好处非常直接:你可以单独替换路径规划算法而不影响防撞逻辑,也可以只调试防撞参数而不用把整个仿真重跑一遍。好多初学者容易犯的错误是把所有功能写在一个大脚本里,后面改参数改算法都得层层翻找,几十个变量命名混乱到直接跑不动。这种坑我踩过多次,所以推荐模块化分开写。

2. 核心算法选型与Matlab工具链解析

2.1 路径规划主算法怎么选

路径规划算法选择直接影响协同效果。我在不同阶段尝试过A*、RRT、人工势场法和粒子群优化,各有适用场景。

A*算法适合栅格地图的全局路径搜索,得到路径质量高,但是扩展无人机数量时需要维护多份地图状态,内存开销不小。RRT及其变体适合高维空间和复杂约束,随机采样的特性在动态环境下反而容易产生不确定路径,实际工程不太好用。

最终我给主规划层选了人工势场法(Artificial Potential Field, APF)加局部优化。人工势场法的核心思路很直白:目标点产生引力,障碍物产生斥力,合力驱动无人机运动。它的优点在于计算快、适合实时控制、代码实现简洁,适合做动态环境下的快速响应;缺点也明显,就是容易陷入局部极小值,这在后文会详细说解决思路。

辅助使用粒子群优化(PSO)来做多机目标分配。PSO在多目标组合优化问题上表现稳定,多无人机任务分配可以编码成每个无人机的目标点序列,适应度函数综合考虑总航程、时空冲突风险,迭代出较优分配方案。

2.2 防撞策略:速度障碍法为主力,优先级分配为兜底

动态环境下防撞我选用速度障碍法(Velocity Obstacle, VO)作为主策略。速度障碍法的核心思想,是把无人机和障碍物的相对位置、相对速度映射到一个速度空间,凡是会导致未来碰撞的速度向量,都纳入“禁入区域”,当前状态可用的避障速度范围就是可行速度集减去禁入区域,从中选择最优速度即可。

单说概念可能比较抽象,我用生活场景打个比方:你在拥挤的人流中走路,目标方向在正前方,但有个迎面走来的人,你会在心里快速估算——以你我当前的速度继续走下去,几秒后会撞上,于是你调整步伐(减速、换个方向),这个瞬间决策就是速度障碍法的思想。

多无人机之间的防撞,我在VO基础上增加了优先级分配机制:为每架无人机设置动态优先级,低优先级的无人机负责避让高优先级的无人机。这样避免了双方同时避让反而撞上的“乒乓效应”。

2.3 为什么选Matlab而不是其他语言

多无人机协同仿真涉及大量矩阵运算、绘图和数值计算,Matlab在这几方面天然占优。矩阵化编程让运动学模型更新非常简洁,内置的绘图接口让实时可视化几乎零成本。此外Matlab的调试环境比C++友好太多,你能随时中断查看每个变量的状态,这在调试防撞逻辑时太重要了。

也有同事建议用C++加ROS方案,理由是可以直接移植到真实无人机。但真实环境本身也有Matlab的代码生成工具可以转C++,所以研发阶段用Matlab验证算法、后期再转工程语言是更高效的选择。我的原则是:验证阶段追求的是快速迭代,Matlab完胜。

3. 基于Matlab的整套实现流程:从参数初始化到结果分析

3.1 环境初始化与参数设定

环境初始化的关键是定义好所有全局参数。我按如下结构组织参数:

% 环境参数 simTime = 100; % 仿真时长(s) dt = 0.05; % 控制周期(s) mapRange = [-10, 10, -10, 10]; % 地图范围 % 无人机参数 nUAV = 4; safeDist = 0.8; % 无人机间安全距离(m) maxSpeed = 2.0; % 最大速度(m/s) maxAccel = 1.5; % 最大加速度(m/s^2) % 人工势场参数 attGain = 1.0; % 引力增益 repGain = 2.5; % 斥力增益 repRadius = 2.0; % 斥力影响范围 % 动态障碍物参数 nObs = 3; obsVel = [0.3, -0.2; -0.4, 0.1; 0.2, 0.3];

参数设定看似简单,实际是整套系统最容易出问题的环节。安全距离设得太小,多机之间容易擦碰;设得太大,又会严重影响路径效率,导致无人机绕远路。我的经验是先按无人机的物理尺寸乘以1.5倍作为基础安全距离,再根据仿真效果微调。斥力影响半径同理,太大会导致目标点附近振荡,太小又对障碍物反应迟钝。

3.2 无人机单体运动学模型搭建

无人机运动学模型是仿真基础。我不会引入过于复杂的空气动力学模型,而是在三维环境下做简化的质点模型,加上加速度限制和一阶速度响应来模拟无人机的动力特性。

for i = 1:nUAV % 根据加速度更新速度 uav(i).velocity = uav(i).velocity + uav(i).accel * dt; % 限制最大速度 speed = norm(uav(i).velocity); if speed > maxSpeed uav(i).velocity = uav(i).velocity / speed * maxSpeed; end % 更新位置 uav(i).position = uav(i).position + uav(i).velocity * dt; end

为什么要加加速度限制?这一条我在带学生做项目时反复强调过。如果你直接让无人机的位置跳变到目标点,规划算法确实能算出完美路径,但物理上根本飞不出来。加入加速度和速度限制,才能让仿真结果具备实际参考价值。

3.3 协同层:任务分配与路径重规划

协同层负责两件事:初始的任务分配和运行过程中按需触发的前全局重规划。任务分配我用PSO算法,把nUAV架无人机分配到nTarget个目标点上,目标是让总飞行时间和风险最小。

function assignment = psoTaskAllocation(uavPos, targetPos, nUAV) % 粒子群任务分配 % 每个粒子的位置编码为一个排列,代表无人机到目标的对应关系 nParticles = 50; nIter = 100; % 初始化粒子群(这里简化为随机排列) particles = repmat(1:nUAV, nParticles, 1); for p = 1:nParticles particles(p, :) = randperm(nUAV); end % 迭代优化(完整实现含速度更新和最优记录,此处略) % 适应度函数:总航程 + 冲突代价 assignment = particles(bestIdx, :); end

初始分配完成后,若某架无人机发现原定目标区域不可达(比如动态障碍物长期占据通道),会触发协同层的重分配。这里有个实际遇到过的教训:重分配不能太频繁,否则系统会陷入“分配-重规划-再分配”的振荡循环,我加了一个最小重分配间隔参数(10秒内最多触发一次),效果明显改善。

3.4 防撞层:动态障碍检测与避让逻辑

防撞层是动态环境下协同规划的重中之重。核心逻辑分三步:冲突检测、速度避让计算、路径修正。

function newVel = collisionAvoidance(uav, obsList, safeDist) % 基于速度障碍法的防撞 feasibleVel = []; for vx = -1:0.1:1 for vy = -1:0.1:1 v = [vx, vy]; conflict = false; % 检查每个障碍物 for j = 1:length(obsList) obs = obsList(j); relPos = obs.position - uav.position; relVel = uav.velocity - obs.velocity; % 计算最近相遇距离(简化版) if norm(relPos) < safeDist conflict = true; break; end % 判断相对速度方向是否指向障碍物 relativeSpeedDir = relVel / norm(relVel); if dot(relPos, relativeSpeedDir) > 0 distance = abs(cross([relPos, 0], [relativeSpeedDir, 0])); if distance(3) < safeDist conflict = true; break; end end end if ~conflict feasibleVel = [feasibleVel; v]; end end end % 从可行速度中选最接近期望速度的 if ~isempty(feasibleVel) [~, idx] = min(vecnorm(feasibleVel - uav.desiredVel, 2, 2)); newVel = feasibleVel(idx, :); else newVel = [0, 0]; % 无法避让时紧急悬停 end end

这段代码是个简化版本,但核心逻辑清晰:枚举候选速度、检测潜在冲突、选出最安全且最接近预期方向的速度。实际项目中我还加入了对不可行解的处理——如果所有候选速度都冲突,就让无人机紧急减速悬停,而不是硬着头皮往前冲。

有一点必须提醒:速度枚举的分辨率直接影响了避让质量和计算开销。分辨率设0.1时会非常细致,但意味着数百次冲突判断,多机同时避让时单步计算压力很大。我的折中方案是:先粗粒度枚举找到可行区域,再在最优候选速度附近做一次细粒度搜索,性能差不多能提升3到4倍。

3.5 可视化与仿真结果分析

可视化是Matlab做算法的巨大优势。我用Matlab的动画接口做实时轨迹渲染,叠加静态障碍物、动态障碍物和无人机间的预测路径。

figure; hold on; grid on; axis(mapRange); % 初始化无人机绘图句柄 uavPlots = gobjects(nUAV, 1); trailPlots = {}; for i = 1:nUAV uavPlots(i) = plot(0, 0, 'o', 'MarkerSize', 8, 'LineWidth', 2); trailPlots{i} = animatedline('Color', colors(i, :), 'LineWidth', 1.5); end % 仿真主循环 for t = 0:dt:simTime % 更新各模块状态(略) % 更新绘图 for i = 1:nUAV set(uavPlots(i), 'XData', uav(i).position(1), 'YData', uav(i).position(2)); addpoints(trailPlots{i}, uav(i).position(1), uav(i).position(2)); end drawnow limitrate; end

drawnow limitrate这个函数用法值得特别强调:它限制了刷新率,只保留最新几帧,显著减小编排负担。从我实测来看,不加limitrate时仿真相对于加了的会明显卡顿,多机数量到了8架以上时差别非常明显。

运行结束后我还会绘制每架无人机的飞行轨迹图、速度曲线图和航程统计表,这部分的产出质量直接决定了研究结论的可信度。表格化的结果输出我一直保留,后面的调试能少走好多弯路。

4. 关键函数与代码片段深度解析

4.1 人工势场主函数

这篇文章里,人工势场函数是路径规划的基础,在这里详细展开:

function accel = apfForce(uav, target, obstacles) % 人工势场计算合力加速度 repulsion = [0, 0]; attraction = [0, 0]; % 目标点引力 vecToTarget = target - uav.position; distToTarget = norm(vecToTarget); directionToTarget = vecToTarget / distToTarget; attraction = attGain * directionToTarget; % 障碍物斥力 for k = 1:size(obstacles, 1) obsPos = obstacles(k, :); vecToObs = obsPos - uav.position; distToObs = norm(vecToObs); % 只有进入影响范围才产生斥力 if distToObs < repRadius repulsionMag = repGain * (1/distToObs - 1/repRadius) / (distToObs^2); repulsion = repulsion + repulsionMag * (vecToObs / distToObs); end end % 合力 accel = attraction + repulsion; % 限幅 if norm(accel) > maxAccel accel = accel / norm(accel) * maxAccel; end end

势场参数调节的经验:repGain和attGain的比例直接决定路径形态。比例偏大,无人机绕障碍半径大,路径浪费明显;比例偏小,则有碰撞风险。我一般先调整斥力影响范围让路径不至于穿过障碍物,再微调两个增益直到路径自然顺滑。

4.2 多机间防撞判断函数

多机防撞和单机避障的最大区别是双方都在运动,所以冲突判断要考虑相对运动趋势。

function needAvoid = checkPairConflict(uav_i, uav_j, safeDist, dt) relPos = uav_i.position - uav_j.position; relVel = uav_i.velocity - uav_j.velocity; dist = norm(relPos); % 当前已经小于安全距离,必须避让 if dist < safeDist needAvoid = true; return; end % 预测Δt时间后的相对位置 futureRelPos = relPos + relVel * dt; futureDist = norm(futureRelPos); % 未来距离小于安全距离则触发避让 if futureDist < safeDist needAvoid = true; return; end % 考虑障碍能力,添加缓冲 stoppingDist = norm(relVel)^2 / (2 * maxAccel); if dist < safeDist + stoppingDist needAvoid = true; return; end needAvoid = false; end

需要指出的是,第三段判断“停止距离”是我在实际仿真中加上去的。原因是两架无人机高速相向飞行时,即使当前距离略大于安全距离,留给反应的时间也很短。加入基于速度的缓冲距离后,系统能更早触发避让,稳定性显著提升。

4.3 仿真主调度循环

主循环是整个系统的中枢,负责按时间轴调度各模块:

for t = 0:dt:simTime % 1. 动态环境更新(障碍物移动、机场状态变化等) updateEnvironment(t); % 2. 检查是否触发协同层重规划 if mod(t, replanPeriod) < dt triggerReplan(); end % 3. 每架无人机独立计算期望速度 for i = 1:nUAV uav(i).desiredVel = apfForce(uav(i), uav(i).target, obstacles); end % 4. 多机防撞协调 for i = 1:nUAV for j = i+1:nUAV if checkPairConflict(uav(i), uav(j), safeDist, dt) applyAvoidance(uav(i), uav(j), safeDist); end end end % 5. 动态障碍物避让 for i = 1:nUAV newVel = collisionAvoidance(uav(i), dynamicObs, safeDist); uav(i).velocity = newVel; end % 6. 更新状态与可视化 updateStates(dt); updateVisualization(t); end

主循环的调度顺序很重要:必须先更新环境,再规划,再防撞,最后更新状态。如果顺序反了,可能出现使用上一帧过时数据的情况,动态环境下这种延迟累积可能导致严重的避撞响应滞后。

5. 常见问题与调试经验实录

5.1 无人机陷入局部极小值

人工势场法最著名的坑就是局部极小值:无人机在障碍物与目标点的共同作用下,受力平衡停在某处,既不能前进也不后退。我一开始遇到这个问题时,第一反应是调大引力增益,结果治标不治本,反而产生路径振荡。

解决思路有两个方向:一是在势场计算中加入额外的随机扰动,当无人机检测到速度长期趋零且未到达目标时,人为施加一个随机方向的辅助力帮助跳出局部极小;二是引入虚拟子目标点,在局部极小位置附近设置中间目标引导。我实际用的是第二种,加入虚拟子目标后的效果明显更稳定。

5.2 多机避让时出现“振荡和乒乓效应”

两架无人机迎面相遇时,如果双方同时往同一方向避让,会出现反复横跳最终相撞的“乒乓现象”。这个问题的本质是协同逻辑缺失,每一方都不知道对方会选择哪侧避让。

我的解决方案是引入避让方向约定:在checkPairConflict函数中,约定两架相遇的无人机统一从对方右侧通过。这个约定信息在初始化时写入每架无人机,遇到冲突时按约定方向计算避让速度,振荡问题迎刃而解。

5.3 参数过于敏感,改一处崩全盘

协同系统的参数彼此关联,单独调整一个可能引发连锁反应。比如减少安全距离,防撞触发变少,路径效率提高,但多机距离过近时气流干扰和飞控风险上升;增大斥力增益,路径更保守,但多机通过率下降,重规划更频繁。

我的做法是建立“参数参考表”,把每类场景的关键参数记录下来:

场景安全距离斥力增益速度上限说明
开阔巡检1.02.03.0低密度,追求效率
城市物流1.53.02.0障碍密集,保守飞行
编队表演0.81.52.5队形保持优先
应急救援1.22.54.0速度优先,容错较低

这样在复现实验或切换到新场景时,不是盲目试参数,而是以参考表为基础做针对性微调,效率高得多。

5.4 仿真速度慢,多机数量增加后帧率塌陷

当无人机数量从4架增加到8架时,如果防撞逻辑依然使用全矩阵枚举,单步耗时会显著增加。我尝试过两种优化方式:一是将避让速度的候选集合从全平面网格改为扇形采样,即只考虑当前速度方向附近的扇形区域,能砍掉六成以上的候选数量;二是使用平滑曲线插值替代部分逐帧防撞计算,在路径变化不剧烈的时间窗口内直接沿用上一帧结果。

实测效果明显:优化前8架无人机单步计算约35毫秒,优化后降到约12毫秒,基本可以保证实时仿真。

5.5 动态障碍物的“预测-避让”滞后

动态障碍物移动时,只靠当前位置计算避让,会让无人机像在追逐陀螺一样被动反应。改进方式是在冲突检测中加入障碍物运动趋势预测:

% 预测障碍物未来位置,用预测位置参与避让计算 predictT = 1.0; % 预测时间(s) predictedObsPos = obs.position + obs.velocity * predictT;

这个预测时间也不算越高越好,它受障碍物运动稳定性影响:障碍物速度较稳取长预测,变化快取短值。我一般让无人机在距离障碍物两倍安全距离之外时才启用预测避让,这个距离按当前速度算出。

6. 成果展示与实际效果评估

仿真跑通后,我习惯做三组对比实验来验证系统的有效性:静态环境基准实验、动态环境单机防撞实验、动态环境多机协同防撞实验。

静态环境基准实验用来检验路径规划算法的正确性:无人机从起点出发,绕过固定障碍抵达目标,路径长度与理论最短路径对比偏差不超过8%。动态环境单机实验引入运动障碍物,验证大部分时间无人机从初始规划出发,在探测到接近障碍时及时触发避让逻辑,路径平滑度有小幅损失,但安全性完全满足要求。

最关键的第三组实验是多机协同,我设置了4架无人机、2个动态障碍物和一个共享目标区域。系统运行100秒内,累计发生了14次潜在冲突,全部被防撞层成功化解,没有发生实际距离小于安全阈值的危险事件;同时任务完成率达到100%,所有无人机都按时到达了指定区域。

这套方案在实际项目中的价值,不仅在于仿真图看起来漂亮,而是把“动态环境”和“协同防撞”这两件看起来复杂的事拆成了清晰可复用的模块化流程。从规划到防撞,每一层都可以独立调优。

7. 从这套研究中总结出的几点个人体会

最后分享几个我个人在实践中收获比较大的体会。

第一,多无人机协同的难点不在算法本身,而在对系统状态的统一认知。每架无人机对环境的认知可能存在偏差,防撞机制必须允许这种偏差存在并做兼容处理。速度障碍法本质上就是在没有绝对全局信息条件下的保守决策,所以在分布式的动态环境中表现得格外稳定。

第二,仿真时的“理论最优”和“工程可用”之间永远有距离。我在调试过程中最大的收获,就是学会给自己的规划结果打上“物理可行性”的校验标签——不光是路径能走,还要看加速度、转弯半径、通信延迟这些工程约束能不能满足。

第三,参数管理应该从第一版代码就重视起来。所有关键参数集中定义,命名规范统一,这样后续无论是调试还是交接都能省下大量时间。

这套Matlab代码实现现在已经整理成了固定版本,对动态环境下多无人机协同路径规划研究来说,我自己的体会是:不需要一上来就追求多么高级的算法,把基础的势场规划、速度障碍防撞、优先级仲裁做好,配合合理的重规划策略,已经能覆盖大多数场景。后续如果你也想在这个方向深入,可以从动态目标分配、通信约束建模、三维复杂环境扩展到更多维度。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/20 6:24:34

FPGA内存设计避坑指南:从Block RAM读写冲突到时序收敛的十个陷阱

做FPGA的人应该都有这种体会&#xff1a;仿真全绿、上板偶发错数&#xff0c;抓狂一整晚&#xff0c;最后定位到根本不是逻辑写错&#xff0c;而是Memory相关的使用细节出了问题。我在存储控制器、图像缓存、协议处理这几类项目里被FPGA Memory使用中的坑反复折腾过&#xff0c…

作者头像 李华
网站建设 2026/10/20 6:24:33

Python幻灯片生成引擎:用代码构建可版本控制的PPTX

1. 项目概述&#xff1a;这不是一个PPT模板库&#xff0c;而是一套可编程的幻灯片生成引擎“ppt-master”这个名字乍一听像某个网红PPT资源站&#xff0c;但实际接触过的人很快会发现——它根本不是传统意义上的模板合集。我第一次在某技术社区看到这个词时&#xff0c;还以为是…

作者头像 李华
网站建设 2026/10/20 6:24:26

WSL2 + pnpm 环境下部署 Paperclip:从 Node 版本到权限控制

WSL2 pnpm 环境下部署 Paperclip&#xff1a;从 Node 版本到权限控制 【免费下载链接】paperclip The open-source app everyone uses to manage agents at work 项目地址: https://gitcode.com/GitHub_Trending/papercl/paperclip Paperclip 把自己定位为"每个人…

作者头像 李华
网站建设 2026/10/20 6:23:51

ArtCraft:创意工作者的最小可行工作流方法论

1. 项目概述&#xff1a;ArtCraft 不是“艺术手作”的简单拼贴&#xff0c;而是一套可落地的创意生产方法论ArtCraft 这个词乍看像英文直译——art&#xff08;艺术&#xff09;和 craft&#xff08;工艺/手艺&#xff09;的组合&#xff0c;很容易被理解成“艺术手工”“创意D…

作者头像 李华
网站建设 2026/10/20 6:23:29

SAP学习笔记 - ABAP开发07 - SQP Query,使用程序方式创建Info Set

上两章学习了使用表连接/逻辑数据库方式创建信息集。 SAP学习笔记 - ABAP开发05 - SQP Query&#xff0c;使用表连接方式创建Info Set-CSDN博客 SAP学习笔记 - ABAP开发06 - SQP Query&#xff0c;使用逻辑数据库方式创建Info Set-CSDN博客 本章学习使用程序创建信息集。 目…

作者头像 李华
网站建设 2026/10/20 6:23:18

Python作用域规则:为什么x = x + 1会报UnboundLocalError?

1. 这个看似简单的Python作用域规则&#xff0c;为什么让90%的初学者栽在同一个坑里&#xff1f;“Python中&#xff0c;若没有使用global或nonlocal关键字对局部变量进行声明&#xff0c;在局部作用域中&#xff0c;可以访问全局命名空间中的变量&#xff0c;但不可对其进行赋…

作者头像 李华