更改函数中的列表

时间:2017-05-22 17:27:40

标签: python

我正在尝试从文本文件加载到列表中,但它似乎完全被忽略了。相关代码:

pupils = []

def Load():    
    in_file = open("school.txt", "rb")
    pupils = pickle.load(open("school.txt", "rb"))
    in_file.close()

print(pupils)

我希望它能打印整个列表,但会返回NameError: 'pupils' is not defined。即使我只是将其更改为pupils = ["A", "B"],它也会返回相同的错误。为什么列表不会改变?

3 个答案:

答案 0 :(得分:2)

快速回答:在pupils函数中声明Load为全局:

def Load():
    global pupils
    ....

更好的答案:从Load返回列表并将其分配给pupils

def Load():
    with open('school.txt','rb') as p_file:
        pupils = pickle.load(p_file)
    return pupils

pupils = Load()

答案 1 :(得分:1)

从Load()返回学生:

return pupils

pupils = Load()
print(pupils)

有一点需要注意,函数Load()中的变量pupils与外部函数不同 - 它们是两个不同的变量,每个变量都有自己的范围,只是碰巧共享相同的名称,仅此而已。

你也可以让学生全球化,但这绝不是一个好主意 - 随着你的剧本规模增大,全局变量增加了额外的共谋和维护难度。

答案 2 :(得分:1)

在python中,如果要引用全局变量(例如pupils),则需要您明确。这意味着使用global关键字。

因为您没有使用global,当您尝试在函数内部引用pupils时,虽然您指的是Load()内部定义的列表功能。如果它找不到它想要的东西,它会提出NameErrorHere the documentation on global

  

global语句是一个声明,它包含整个当前代码块。这意味着列出的标识符将被解释为全局变量。没有全局变量就不可能分配给全局变量,尽管自由变量可以引用全局变量而不被声明为全局变量。

要解决您的问题,您需要告诉Python您要使用全局puplis列表,而不是名为pupils的本地列表:

pupils = []

def Load():    
    global pupils # expictlly tell Python you referring to the global pupils list
    in_file = open("school.txt", "rb")
    pupils = pickle.load(open("school.txt", "rb"))
    in_file.close()

print(pupils)

但是,使用全局变量几乎不是一个好主意。随着列表大小的增加,全局变量计数也会增加。拥有许多全局变量将导致难以阅读和混淆代码。

创建名为pupils本地列表,而不是让学生成为全局列表,将名称添加到该列表中,然后返回列表。调用列表时,将返回值分配给名为pupils的另一个不同变量。这种方法避免了必须保持任何全局状态,并且是一种更惯用的方法:

def Load():    
    in_file = open("school.txt", "rb")
    pupils = pickle.load(open("school.txt", "rb")) # local pupils list
    in_file.close()
    return pupils

pupils = Load()