为什么下面的代码在循环外给出错误的输出

时间:2019-08-21 22:12:26

标签: python list for-loop

我有下面的python代码

class Cust: 
    def __init__(self): 
        self.name 

surname=["Lai","Sharma","Max"]
def fetchName(surnames):
    custinst=Cust
    custinst.name="Gaurav"+surnames
    return custinst

finalname=[]
print("###inside loop###")
for i in range(len(surname)):
    finalname.append(fetchName(surname[i]))
    print(finalname[i].name)
print("\n###Outside Loop###\n") 
print (finalname[0].name)
print (finalname[1].name)
print (finalname[2].name)

下面是输出

 ###inside loop###
 GauravLai
 GauravSharma
 GauravMax

 ###Outside Loop###

 GauravMax
 GauravMax
 GauravMax

问题是为什么所有值都作为最后分配的值(即GauravMax)外循环出现的原因

1 个答案:

答案 0 :(得分:2)

您正在修改Cust类实例,而不是在每个循环中都为其创建新实例:

def fetchName(surnames):
    custinst=Cust
    custinst.name="Gaurav"+surnames
    return custinst

这里Cust是包含类本身而不是其实例的对象。您可以在print(Cust.name)之后进行Inside Loop进行验证,这将打印GauravMax

您必须通过调用构造函数来创建新实例:

def fetchName(surnames):
    custinst=Cust()
    custinst.name="Gaurav"+surnames
    return custinst

当前,您的构造函数访问name属性,但尚未设置,因此将导致错误。您可以避免这种情况,因为它什么也不做:

def Cust():
    pass

但是在实例化对象时,请考虑使用构造函数的参数:

def Cust():
    def __init__(self, name):
        self.name = name

,然后将名称作为参数传递:

def fetchName(surnames):
    return Cust("Gaurav"+surnames)