1

我试图模仿 Kernighan 和 Ritchie C 编程书中的一些 C 程序,但遇到了 getchar() 的问题。我已经使初始程序正常工作,但是当我将 getchar() 移动到它自己的文件 stdio.py 时,它仅适用于声明import stdio后的stdio.getchar()之类的调用,而不适用于声明类型为 : from stdio import的调用*使用 **getchar() 形式的调用。

我在 FileCopy.py 中的工作代码

import stdio
import StringIO

def FileCopy():
    c = stdio.getchar()
    while (c!=stdio.EOF):
        stdio.putchar(c)
        c = stdio.getchar()



if __name__ == "__main__":
    SRC = raw_input(">>")
    print "Echoe: ",
    stdio.FP = StringIO.StringIO(SRC)
    FileCopy()

我的 stdio.py 的代码

"""
 Python implementation of getchar
"""

EOF =""

# python specific
import StringIO

FP = None
def getchar():
    if FP:
        return FP.read(1)

def ungetc(c=''):
    if FP:
        FP.seek(-1, os.SEEK_CUR)

def putchar(c):
    print c,

好的,到目前为止一切都很好。但是对 stdio.getchar() 的调用看起来很难看,所以我使用了stdio import * 的形式并删除了它们。主要思想是删除所有前缀以提高可读性。没有对 stdio.py 进行任何更改。

"""
File Copy
Kernighan Ritchie page 16
stdio has been created in Python file stdio.py
and defines standard output functions putchar,getchar and EOF
"""

from stdio import *
import StringIO

def FileCopy():
    c = getchar()
    while (c!=EOF):
        putchar(c)
        c = getchar()



if __name__ == "__main__":
    SRC = raw_input(">>")
    print "Echoe: ",
    FP = StringIO.StringIO(SRC)
    FileCopy()

输出;

作为 FP 变量对 getchar() 的无限调用总是返回 NONE。因此,我在输出外壳中得到无限的 NONE 。

问题。为什么第一个示例初始化 stdio.py 中的 FP 变量而第二个示例没有?有简单的解决方法吗?

4

1 回答 1

1

Python 中的全局变量对于一个模块来说是全局的,而不是跨所有模块。您在不同的范围内有不同的 FP。

您已经想出了一个简单的解决方法。导入模块,以便显式引用模块的变量名。

这是为什么“导入 *”不是一个好习惯的示例

来自官方 Python 2.75 FAQ:如何跨模块共享全局变量?

你的建议是“丑陋的”,其他人可能会说是明确和精确的。我希望我能想到的其他选择也同样丑陋。做丑事

于 2013-08-09T21:15:47.153 回答