我正在尝试从文本文件加载到列表中,但它似乎完全被忽略了。相关代码:
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"]
,它也会返回相同的错误。为什么列表不会改变?
答案 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()
内部定义的列表功能。如果它找不到它想要的东西,它会提出NameError
。 Here 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()