Python 3无需global,如何在循环内外共享变量?
问题分析与解决方案
首先,咱们先揪出你代码里的两个关键问题,这是导致输出不符合预期的根本原因:
- 致命语法错误:你写的
i=+1(包括字典和空类里的ns['i']=+1、ns.i=+1)并不是自增操作!这行代码的意思是把变量赋值为正整数1,而不是在原有值基础上加1。正确的自增写法是i += 1(等价于i = i + 1)。 - 空类示例的笔误:最后那个空类的print语句里,你写了
format(ns,i),这里的逗号是错误的,应该是format(ns.i)才能正确访问类实例的属性。
为什么你的思路其实是对的?
在同一个函数test()内部,所有定义的变量本来就共享同一个局部作用域——不管是在for循环里、while循环里,还是函数顶层,都是同一个作用域。所以你最初用普通变量的思路完全可行,根本不需要字典或者空类(当然这两种方式也能工作,只要修正语法)。
修正后的代码示例
1. 普通变量(最简单的方案)
def test(): i = 0 for e in range(5): i += 1 # 正确的自增操作 print('i in for loop {}'.format(i)) while True: print('i in while {}'.format(i)) break test()
2. 字典方式(修正后)
def test(): ns = {} ns['i'] = 0 for e in range(5): ns['i'] += 1 print('i in for loop {}'.format(ns['i'])) while True: print('i in while {}'.format(ns['i'])) break test()
3. 空类方式(修正后)
class Namespace: pass def test(): ns = Namespace() ns.i = 0 for e in range(5): ns.i += 1 print('i in for loop {}'.format(ns.i)) while True: print('i in while {}'.format(ns.i)) # 修正了笔误 break test()
运行结果
以上三个修正后的代码都会输出你期望的结果:
i in for loop 1 i in while 1 i in for loop 2 i in while 2 i in for loop 3 i in while 3 i in for loop 4 i in while 4 i in for loop 5 i in while 5
总结
完全存在无需使用global的解决方案——而且非常简单:只要修正自增的语法错误,普通的局部变量就能在循环内外共享。字典和空类的方式其实是“绕远路”了,因为同一个函数内的作用域本来就是共享的,除非你是在嵌套函数中需要修改外层函数的变量(那时候会用到nonlocal关键字),但你的场景完全不需要。
内容的提问来源于stack exchange,提问作者JGFMK
相关产品推荐
相关产品推荐

