私はyieldを使用して、正規表現とre.sub()を使用して抽出されている文字列のチャンクを返すジェネレーターを作成しています。うまくいくアプローチを見つけましたが、以下に示すように、なぜそれが一方向に機能するのに別の方法では機能しないのかについて少し混乱しています。
これは機能しません(processchunk()はsplitmsgで宣言されたチャンクに割り当てられていません):
def splitmsg(msg):
chunk = None
def processchunk(match):
chunk = match.group(1)
return ""
while True:
chunk = None
msg = re.sub(reCHUNK,processchunk,msg,1)
if chunk:
yield chunk
else:
break
これは機能します(チャンクである唯一の違いはリストチャンクであることに注意してください):
def splitmsg(msg):
chunks = [ None, ]
def processchunk(match):
chunks[0] = match.group(1)
return ""
while True:
chunks[0] = None
msg = re.sub(reCHUNK,processchunk,msg,1)
if chunks[0]:
yield chunks[0]
else:
break
私の質問は基本的に、チャンク/チャンク変数のスコープがプレーン変数であるかリストであるかに依存しているように見えるのはなぜですか?