修改全局变量时发生NameError

时间:2018-08-08 13:43:33

标签: python-3.x

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

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

代码有什么问题?

1 个答案:

答案 0 :(得分:0)

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()和相关答案:{{3} })

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