Python如何使用for循环按序号动态调用对应命名变量
问题说明
原有代码试图通过字符串拼接动态调用带序号的变量,但写法存在语法错误,无法正常运行。原有错误代码如下:
second_canvas = 250*np.ones((300,300,3), dtype="uint8") cv2_imshow(second_canvas) cX1,cY1 = (second_canvas.shape[1]//2,0) cX2,cY2 = (second_canvas.shape[1],second_canvas.shape[0]//2) cX3,cY3 = (second_canvas.shape[1]//2,second_canvas.shape[0]) for i in range(1,4): cv2.circle(second_canvas, (cX'{}',cY'{}').format(i), 175,(0,255,0)) cv2_imshow(second_canvas)
需求是循环时根据i值自动匹配对应序号的坐标变量:i=1时取cX1、cY1,i=2时取cX2、cY2,i=3时取cX3、cY3。
实现方案
方案1:用列表存储坐标(优先推荐)
零散的同类型序号变量本身就不推荐单独定义,直接把坐标按顺序存入列表,循环时直接按索引取值即可,代码可读性、可维护性最高,不会出现动态变量名的各类异常:
second_canvas = 250*np.ones((300,300,3), dtype="uint8") cv2_imshow(second_canvas) # 按顺序存储三个圆心坐标 circle_centers = [ (second_canvas.shape[1]//2, 0), (second_canvas.shape[1], second_canvas.shape[0]//2), (second_canvas.shape[1]//2, second_canvas.shape[0]) ] for center in circle_centers: cv2.circle(second_canvas, center, 175, (0,255,0)) cv2_imshow(second_canvas)
如果需要保留i值做其他逻辑,也可以按索引取值:
for i in range(3): cv2.circle(second_canvas, circle_centers[i], 175, (0,255,0))
方案2:动态获取当前作用域的变量
如果已经定义了大量cX1、cY1这类零散变量,不想重构代码,可以通过globals()(全局作用域)或locals()(局部作用域)返回的变量字典,用拼接好的变量名字符串做key取值:
for i in range(1,4): current_cx = globals()[f"cX{i}"] current_cy = globals()[f"cY{i}"] cv2.circle(second_canvas, (current_cx, current_cy), 175, (0,255,0))
注意:该方式可维护性差,变量名拼写错误会直接抛出KeyError,非必要场景不建议使用。
原写法错误原因
Python中变量名属于标识符,不能直接在标识符中间插入字符串格式化语法,cX'{}'本身就不符合Python语法规则,代码在解析阶段就会报错,根本不会执行到.format(i)的逻辑。
内容的提问来源于stack exchange,提问作者Rakshit Joshi
相关产品推荐
相关产品推荐

