你好,我熟悉python,在c++之后我断然不明白使用全局变量的原理。如果一个位于def中的变量指定了全局,那么它的值是否可以在这个函数之外使用,我肯定不能。也许只是因为我是一个初学者,而显而易见的事情对我来说仍然太复杂了。
def check():
global urokb_in
urokb_in = 1
with open('users.txt', 'r') as f:
line = f.readline()
f.close()
with open('progress.txt', 'r') as k:
while True:
global uroka_in
lines = k.readline()
if line == lines.rstrip():
uroka_in = int(k.readline().rstrip())
urokb_in = uroka_in + 1
uroka_str = str(uroka_in)
urokb_str = str(urokb_in)
lines.replace(uroka_str, urokb_str)
k.close()
break
if not lines:
k.close()
urokb_in = 1
with open('progress.txt', 'a') as j:
j.write(line)
j.write('\n')
j.write(str(urokb_in))
j.write('\n')
j.close()
break
if urokb_in == 1:
educate__scr = PhotoImage(file='e_scr_1.png')
educate_label = Label(root, image=educate__scr)
educate_label.place(x=0, y=0)
更有经验的编码人员告诉我如何解决它。SyntaxError: name 'urokb_in' 在全局声明之前使用
如果您不指定全局或非局部,则它
x =会在函数内部创建一个局部变量。如果您想创建一个新的全局变量/或在函数内部重新定义一个旧变量(而不是在全局级别),则可以使用 global。
multiprocessing这在使用模块从父进程继承所需的全局变量时很有用:完整的代码示例。
如果您只想使用现有的全局变量而不重新定义它,则不需要 global(否则,例如,您必须在每个函数、每个使用的模块、每个全局函数中声明 global)。
对于初学者:根本不要重新定义全局变量,即避免
global. 将代码中每次出现的 global 都视为错误,除非有使用此构造的特定原因(如示例中的multiprocessing)。如果你不能摆脱全局,那么创建一个最小的代码示例并提出一个单独的问题:“如何在执行 X 时摆脱全局”该指令
global用于需要明确指出应该使用全局范围内的对象(模块命名空间或全局字典)并取消变量的标准搜索机制(LEGB),除此之外,它还可以更改不在其范围内的对象。通常需要纪律,因为如果在global a嵌套范围内的声明之前аOB 中没有名称globals(),它将在第一次赋值操作期间创建,并且在工作(例如,函数)结束时不会消失。需要在一开始就直接在函数体中指定一个全局变量,例如:
在While True之后就行了:不需要再定义全局。该变量之前已经定义过。