我试图通过在其类上调用方法来更改python变量。我的实际代码比下面的代码复杂得多,但下面说明了这个问题。我理解自我意味着有问题的类的实例,所以我想只需要自我。= 5或任何可行的。但事实并非如此。
我确信我错过了一些非常明显的东西。我刚刚进入Python课程,这一切看起来都相当简单,我多年前就记得OOP,但经过几个小时尝试不同的事情,谷歌搜索各种各样的短语,我仍然卡住了。我正在使用Python 2.7。
from Tkinter import *
class mylistbox(Listbox):
def __init__(self, *args, **kwargs):
Listbox.__init__(self, *args, **kwargs)
self.val = 2 # setting val in this instance to 2
def change(self, newval): #in my real code this method does a lot more
self.val = newval # this doesn't change val in this instance!
print "self.val is now " + str(self.val)
def callback(x):
print x
top = Tk()
listbox = mylistbox(top)
listbox.pack()
b = Button(top, text="change", command = lambda zzz=7: listbox.change(zzz))
b.pack()
b = Button(top, text="answer", command = lambda myval=listbox.val: callback(myval))
b.pack()
top.mainloop()
如果我点击答案,更改,然后回答,我得到的输出是......
答案 0 :(得分:2)
在定义时评估lambda默认值listbox.val
。所以,如果你使用
lambda myval=listbox.val: callback(myval)
然后myval
的默认值永远等于2。
相反,您可以使用
b = Button(top, text="answer",
command=lambda mybox=listbox: callback(mybox.val))
答案 1 :(得分:2)
实际上,它正在改变就好了!问题与你的班级无关;这是造成它的第二个lambda。 Python中的默认值是在创建函数时计算的,而不是在调用它时:myval
的默认值在创建lambda时绑定到listbox.val
的值,并且不会更改否重要的是listbox
。
如果您将lambda更改为lambda box=listbox: callback(box.val)
,则更改将会显示。