Python 中函数外部的局部变量 [duplicate]

local variables outside a function in python [duplicate]

提问人:Meat_Mr8h 提问时间:11/1/2023 最后编辑:Mike 'Pomax' KamermansMeat_Mr8h 更新时间:11/1/2023 访问量:79

问:

我有一个这样的代码

def inputs():
    q_number = int(1)
    number_of_q = int(0)
    q = {}
    x = {}
    y = {}
    xxxx = 1
    for i in range(4):
        C = float(qq[xxxx].get())
        X = float(xxx[xxxx].get())
        Y = float(yy[xxxx].get())
        if C != 0 or C != "":
            q[q_number] = C
            x[q_number] = X
            y[q_number] = Y
            q_number += 1
            number_of_q += 1

它工作正常,我唯一的问题是我正在尝试在函数之外打印重复的 q、x、y,这样我就可以在其他东西中使用它们,但它根本不起作用

我试图将函数编写为正常状态,并在函数外部全局双 q x y

def inputs():
    q_number = int(1)
    number_of_q = int(0)
    q = {}
    x = {}
    y = {}
    xxxx = 1
    for i in range(4):
        C = float(qq[xxxx].get())
        X = float(xxx[xxxx].get())
        Y = float(yy[xxxx].get())
        if C != 0 or C != "":
            q[q_number] = C
            x[q_number] = X
            y[q_number] = Y
            q_number += 1
            number_of_q += 1
    global number_of_q, q_number, q, x, y
    print(number_of_q, q_number, q, x, y)

但是程序给了我一个错误(NameError:未定义名称'number_of_q') 有人可以帮我吗?

python 函数 变量 global local

评论

3赞 Mike 'Pomax' Kamermans 11/1/2023
为什么不直接将这些值设置为函数参数,然后使函数以元组的形式返回更新的值呢?使用全局变量几乎从来都不是更新值的方法,你用它需要的输入调用一个函数,它生成输出,然后你(通过你的代码)决定如何处理结果,其中可能包括“更新你传入的变量”。
0赞 quamrana 11/1/2023
请用您的真实代码更新您的问题。在我看来,应该有一个错误: .什么?qq[xxxx].get()qq
0赞 user19077881 11/1/2023
目的是什么?哪些值不满足条件?此外,etc 是多余的,因为 1 已经是 int。if C != 0 or C != ""int(1)
0赞 Meat_Mr8h 11/1/2023
我不能,因为 tkinter 程序通过多个输入框输入这些值,确切地说是 12 个值,并且该函数是由一个按钮调用的,该按钮将其命令设置为函数

答:

0赞 OysterShucker 11/1/2023 #1

下面创建 StringVar 组。该函数将 StringVar 组镜像为浮点值。我用 12 个 Entry 小部件和 Button 充实了它。update_fltdbfltdb

import tkinter as tk

root  = tk.Tk()

SVDB  = ([], [], []) #groups of StringVar
fltdb = ([], [], []) #groups of float


#mirror SVDB as float results
def update_fltdb() -> None:
    fltdb = ([], [], [])
    for group, out in zip(SVDB, fltdb):
        for sv in group:
            try   : out.append(float(sv.get()))
            except: 
                sv.set('0.0')
                out.append(0.0)
    
    print(fltdb)
    

#build stringvar database
for x, group in enumerate(SVDB):
    for y in range(4):
        (sv := tk.StringVar(root)).set(f'{x}.{y}')
        tk.Entry(root, textvariable=sv).grid(column=x, row=y, sticky='nswe')
        group.append(sv)


#button
button = tk.Button(root, text='click', command=update_fltdb)
button.grid(column=x, row=y+1, sticky='e')
button.invoke() #update_fltdb


if __name__ == '__main__':
    root.mainloop()

您可以解压缩为所需的任何名称。

q, x, y    = fltdb
qv, xv, yv = SVDB