Python类变量作用域异常及方法调用结果不符问题咨询
你的代码是基于Python 2编写的(从print语句、raw_input()的使用能看出来),我们逐个拆解你遇到的异常现象:
1. 为什么return x没有报错?
你提到“x无全局作用域不应运行,却正常执行”,这其实是Python变量作用域查找规则导致的:
在getstring方法里,你只给实例变量self.x赋值了,但返回的是x(没有self.前缀)。按照Python的规则,当函数内找不到局部变量时,会自动向上查找全局作用域的变量。如果你的运行环境中,全局作用域恰好存在一个名为x的变量(比如之前的代码片段定义过),那这行return x就会返回全局的x,自然不会报错。如果全局没有x,运行到这里应该会抛出NameError: name 'x' is not defined。
正确的写法应该是return self.x,这样才是返回你刚通过raw_input()获取的实例变量。
2. 为什么看不到字符串转大写的结果?
你的printstring方法只是返回了大写后的字符串y,但调用d.printstring()时,Python不会自动打印函数的返回值,必须显式用print输出才能看到结果:
print d.printstring() # 这样就能看到大写的字符串了
或者直接修改printstring方法,让它直接打印结果:
def printstring(self): y = self.x.upper() print y return y
3. 调用sum()时的异常现象
你的sum方法和字符串处理完全无关,它的逻辑就是计算初始化时传入的self.b和self.c的和(也就是23+53=76)。调用d.sum()只会返回这个数值,不会对字符串做任何操作。你看到“输入字符串未转为大写,仅输出原字符串”,大概率是因为调用getstring时,raw_input()本身会在控制台显示你输入的内容(这是控制台的默认行为),而sum方法根本没碰字符串,自然不会输出大写结果。
修正后的代码示例
如果要实现你预期的功能(输入字符串、转大写输出、计算初始值之和),可以改成这样:
class a: def __init__(self, b, c): self.b = b self.c = c self.x = "" # 提前初始化实例变量,避免未定义问题 def getstring(self): print "Please enter input" self.x = raw_input() return self.x # 返回实例变量x def printstring(self): y = self.x.upper() print y # 显式打印大写结果 return y def sum(self): total = self.b + self.c print "Sum result:", total return total d = a(23, 53) d.getstring() d.printstring() d.sum()
内容的提问来源于stack exchange,提问作者Prejith Alex

