这是试图在单击按钮时增加数字。

def something():
  CP = 0
  counter = StringVar()
  counter.set("0")
  def click():
    global CP
    global counter
    CP = CP + 1
    counter.set(str(CP))
  label5=Label(window, textvariable=counter, font=("Georgia", 16), fg="blue")
  button5=Button(window, text='Make a Clip', command=click)
  label5.pack()
  button5.pack()


在此部分的第6行上没有名称错误。

Traceback (most recent call last):
File "D:\Program Files\Python\Python36\lib\tkinter\__init__.py", line 1699, in __call__
  return self.func(*args)
File "D:\Program Files\Python\Python36\Paperclips.py", line 14, in click
  CP = CP + 1
NameError: name 'CP' is not defined


代码有什么问题?

最佳答案

CP不是global,而是nonlocal。只需将global替换为nonlocal,即可在嵌入函数中找到该变量。

counter之间有细微的差别。您不需要为其他变量counter进行此操作,因为您只是在使用引用(+=有所不同)。

简单的独立示例:

def a():
    x = 0
    def b():
        nonlocal x  # tell python that x is in the function(s) above
        x += 1
    b()
    print(x)

a()


打印1

+=append与列表一起使用时的有趣区别:

def a():
    l = []
    def b():
        l.append(435)
    b()
    print(l)

a()


现在有效:

def a():
    l = []
    def b():
        # nonlocal l   # uncomment for it to work
        l += [435]
    b()
    print(l)

a()


这应该是等效的,但必须将+= l声明为nonlocal(更多信息:Concatenating two lists - difference between '+=' and extend()和相关答案:https://stackoverflow.com/a/24261311/6451573

但是,对于整数,由于整数不可变性,因此+=无法用函数调用BTW代替。因此,nonlocal仍然是唯一可行的选择。

关于python-3.x - 修改全局变量导致的NameError,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51748291/

10-13 09:14