教程集 www.jiaochengji.com
教程集 >  Python编程  >  Python入门  >  正文 Python新手常见问题九:不能区分py2和py3

Python新手常见问题九:不能区分py2和py3

发布时间:2021-12-27   编辑:jiaochengji.com
教程集为您提供Python新手常见问题九:不能区分py2和py3等资源,欢迎您收藏本站,我们将为您提供最新的Python新手常见问题九:不能区分py2和py3资源

不能区分Python 2和Python 3

看下面这个文件foo.py:

<pre class="brush:php;toolbar:false">import sys def bar(i):     if i == 1:         raise KeyError(1)     if i == 2:         raise ValueError(2)   def bad():     e = None     try:         bar(int(sys.argv[1]))     except KeyError as e:         print('key error')     except ValueError as e:         print('value error')     print(e)   bad()</pre>

在Python 2里,运行起来没有问题:

<pre class="brush:php;toolbar:false">$ python foo.py 1 key error 1 $ python foo.py 2 value error 2</pre>

但是如果拿到Python 3上面玩玩:

<pre class="brush:php;toolbar:false">$ python3 foo.py 1 key error Traceback (most recent call last):   File "foo.py", line 19, in <module>     bad()   File "foo.py", line 17, in bad     print(e) UnboundLocalError: local variable 'e' referenced before assignment</pre>

这是怎么回事?“问题”在于,在Python 3里,在except块的作用域以外,异常对象(exception object)是不能被访问的。(原因在于,如果不这样的话,Python会在内存的堆栈里保持一个引用链直到Python的垃圾处理将这些引用从内存中清除掉。更多的技术细节可以参考这里。)

相关推荐:《Python视频教程》

避免这样的问题可以这样做:保持在execpt块作用域以外对异常对象的引用,这样是可以访问的。下面是用这个办法对之前的例子做的改动,这样在Python 2和Python 3里面都运行都没有问题。

<pre class="brush:php;toolbar:false">import sys   def bar(i):     if i == 1:         raise KeyError(1)     if i == 2:         raise ValueError(2)   def good():     exception = None     try:         bar(int(sys.argv[1]))     except KeyError as e:         exception = e         print('key error')     except ValueError as e:         exception = e         print('value error')     print(exception)   good()</pre>

在Py3k里面运行:

<pre class="brush:php;toolbar:false">$ python3 foo.py 1 key error 1 $ python3 foo.py 2 value error 2</pre>

相关推荐:

Python新手常见问题八:标准库模块命名

您可能感兴趣的文章:
Python新手常见问题十:__del__方法
Python新手常见问题九:不能区分py2和py3
一文了解py2/py3编码问题
python library怎么安装
2019学java还是python
python3.6中如何安装pip
python如何保存数据
python语言什么时候发明的
python发明人是谁
Python3爬虫利器:Scrapy-Redis的安装

[关闭]
~ ~