2017-08-08 108 views
-1
g = None 
try: 
    g = open("mydata.txt", "r") 
except IOError: 
    print(’Python could not open the file mydata.txt.’) 
if g: 
    try: 
     lines = g.readlines() 
     print("The list of lines is:") 
     print(lines) 
    except IOError: 
     print(’Error while trying to read the data in the file.’) 

这是一个在我的教科书中使用Python中的tryexcept的示例。该教科书声称“g被初始绑定为None(在if声明的布尔上下文中被视为False)”。根据我的理解,g已经包含了从open函数返回的文件对象,在if语句的布尔上下文中它怎么会被当作False如何将变量分配给两个对象?

回答

0

它不能同时为None和文件的内容;这个想法是,如果open()失败,并且第一个Except块被命中,那么g will still be equal to无。

因此,如果open()进程成功完成,那么if g语句将评估为true,并且该函数将继续。如果open()进程失败,g仍将等于None,因此if g语句将评估为false,并且readlines()部分将被跳过。

1

g从持有None到一个文件对象发生变化时,它AT的重新分配:

g = open("mydata.txt", "r") 

它没有“有2个对象”一次。

+0

感谢您的回复。但是'g'如何在if语句中重新分配'None'?教科书说'g'在if语句的布尔上下文中被视为False。 –

+0

@alexlau它永远不会被重新分配回来。 'try' /'catch'的目的是捕获如果打开文件无法打开的异常。如果'open'抛出异常,重新分配不会发生,所以当'try'退出时'g'仍然保持'None'。 '如果g:'基本上检查打开是否成功。 – Carcigenicate

0

所以理解Python是一种解释语言这是声明

执行的语句时,该代码被编译,编译器知道gg = NoneNone是很重要的。但编译器不断阅读更多的行。当它读取g = open("mydata.txt", "r")那么变量g现在重新分配以保存文件对象而不再是none