在Python脚本中,我遇到了一个在with语句内定义但在该语句外使用的变量,例如以下示例中的file:
with open(fname, 'r') as file:
pass
print(file.mode)
凭直觉,我会说该文件不应在with语句之外,并且只能偶然地起作用.我在Python文档中找不到关于是否应该运行的结论性声明.这种类型的语句是否可以安全使用(也适用于将来的python版本),还是应该避免使用?在Python文档中指向此信息的指针也将非常有帮助.
解决方法:
变量作用域仅适用于功能,模块和类级别.如果您在同一个功能/模块/类中,则所有定义的变量都将在该功能/模块/类中可用,无论它是否在with,for,if等块中定义.
例如,这:
for x in range(1):
y = 1
print(y)
与使用with语句的示例一样有效(尽管毫无意义).
但是,您必须小心,因为如果从未输入代码块,则可能实际上未定义代码块中定义的变量,在这种情况下:
try:
with open('filedoesnotexist', 'r') as file:
pass
except:
pass # just to emphasize point
print(file.mode)
Traceback (most recent call last):
File "<pyshell#43>", line 1, in <module>
file.mode
NameError: name 'file' is not defined
Good description of LEGB rule of thumb for variable scope
标签:with-statement,python 来源: https://codeday.me/bug/20191025/1932526.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。