Python中如何在map调用的函数内使用外部定义的变量?
问题原因与解决方法
为什么会报错?
当你在函数内部对外部的new_pattern执行+=操作时,Python会默认将该变量认定为局部变量。而+=本质是new_pattern = new_pattern + ...,属于赋值操作——Python会先尝试读取局部的new_pattern,但你并没有在函数内定义这个局部变量,所以直接抛出UnboundLocalError。
可行解决方案
方案1:正确使用global关键字
你说用global没解决,大概率是声明位置不对。必须在函数内部使用变量之前声明global new_pattern,明确告诉Python要引用全局变量:
new_pattern = '' def create_pattern(letter): global new_pattern # 必须放在变量使用前 new_pattern += f'{letter}|{letter.upper()}' print(new_pattern) pattern = ['a', 'b', 'c'] # 补充原代码缺失的pattern定义 list(map(create_pattern, pattern))
方案2:用可变对象替代不可变的字符串
字符串是不可变类型,而列表是可变类型。把new_pattern改成列表后,函数内修改列表元素不需要声明global:
new_pattern = [] def create_pattern(letter): new_pattern.append(f'{letter}|{letter.upper()}') print(''.join(new_pattern)) # 转成字符串输出 pattern = ['a', 'b', 'c'] list(map(create_pattern, pattern))
方案3:用参数传递状态(更规范的函数式写法)
如果不想依赖全局变量,可以用itertools.accumulate来传递累积状态,避免全局变量的副作用:
def create_pattern(acc, letter): new_str = acc + f'{letter}|{letter.upper()}' print(new_str) return new_str pattern = ['a', 'b', 'c'] from itertools import accumulate list(accumulate(pattern, create_pattern, initial=''))
内容的提问来源于stack exchange,提问作者poroshat
相关产品推荐
相关产品推荐

