python yield生成器变量范围
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python yield生成器变量范围,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1618字,纯文字阅读大概需要3分钟。
内容图文
![python yield生成器变量范围](/upload/InfoBanner/zyjiaocheng/816/4bc2b5a1d343404fb1b25e01bad5b45e.jpg)
我使用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
我的问题基本上是为什么看起来chunk / chunk变量的范围似乎取决于它是一个普通变量还是一个列表?
解决方法:
在python中,如果读取变量,可以从周围的范围“拉出”变量.所以以下内容将起作用:
def foo():
spam = 'eggs'
def bar():
print spam
foo()
因为在周围的范围内查找变量’spam’,foo函数.
但是,您无法更改周围范围的值.您可以更改全局变量(如果在函数中将它们声明为全局变量),但是您无法在上述函数中对变量垃圾邮件执行此操作.
(Python 3改变了这一点,它添加了一个新的关键字nonlocal.如果你将垃圾邮件定义为bar内的非本地垃圾,你可以在bar中为该变量分配一个新值.)
现在到你的清单.那里发生的是你根本没有改变变量块.在整个代码中,块指向一个列表,并且仅指向该列表.就python而言,变量块在processchunk函数中不会被改变.
发生的是您更改列表的内容.你可以自由地为chunk [0]分配一个新值,因为那不是变量块,它是由块,第一个索引引用的列表. Python允许这样做,因为它不是变量赋值,而是列表操作.
所以,你的“解决方法”是正确的,如果有点模糊.如果你使用Python 3,你可以在processchunk中将块声明为非本地,然后事情也可以在没有列表的情况下工作.
内容总结
以上是互联网集市为您收集整理的python yield生成器变量范围全部内容,希望文章能够帮你解决python yield生成器变量范围所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。