在课外宣布的变量

时间:2014-03-11 17:51:22

标签: python class

按下按钮A打印在MainWindow()类范围定义之外声明的 myVariable 变量。

print  '\n\t myVariable =', myVariable

链接到按钮B的类函数(方法)想要:

  1. 打印出myVariable
  2. 为myVariable分配一个新值(11)
  3. 再次打印此变量。
  4. 但是buttonB_func()失败,第一行抛出UnboundLocalError:

    UnboundLocalError: local variable 'myVariable' referenced before assignment
    

    除了知道如何修复它之外,首先找出为什么会发生这种情况会很有趣。 附:使用:

    创建变量全局变量
    global myVariable
    myVariable=10
    

    没有帮助。

    myVariable=10
    
    class MainWindow(QtGui.QMainWindow):
        def __init__(self):
            super(MainWindow, self).__init__()
            self.main_layout = QtGui.QVBoxLayout()
    
            buttonA = QtGui.QPushButton("Button A")
            buttonA.clicked.connect(self.buttonA_func)      
            self.main_layout.addWidget(buttonA)     
    
    
            buttonB = QtGui.QPushButton("Button B")
            buttonB.clicked.connect(self.buttonB_func)      
            self.main_layout.addWidget(buttonB) 
    
            central_widget = QtGui.QWidget()
            central_widget.setLayout(self.main_layout)
            self.setCentralWidget(central_widget)
    
        def buttonA_func(self):
            print  '\n\t\t\t myVariable =', myVariable, '\n'
    
        def buttonB_func(self):
            print  '\n\t\t\t myVariable =', myVariable, '\n'
            myVariable=11
            print  '\n\t\t\t myVariable =', myVariable, '\n'
    
    
    
    if __name__ == '__main__':
        app = QtGui.QApplication(sys.argv)
        window = MainWindow()
        window.resize(480, 320)
        window.show()
        sys.exit(app.exec_())
    

2 个答案:

答案 0 :(得分:2)

在尝试使用变量之前,将global放在方法体内。

答案 1 :(得分:0)

变量的位置在编译时确定。无论何时分配给变量(使用globalnonlocal),此变量都将成为该范围的本地变量(快速存储或取消存储)。在按钮A中,您不能分配给它,因此它可以工作。在按钮B中,您可以为其分配,因此它是本地的并且失败。正如@Ben指出的那样,如果你将global myVariable作为buttonB_func的第一行,这应该可以解决您的问题。但问题是:为什么要使用全局变量?


正如@AdamCushner指出的那样,你可以让你的变量成为你的类的成员。这些方面的东西:

class MainWindow(QtGui.QMainWindow):
    myVariable=10

    def __init__(self):
        ...

    def buttonA_func(self):
        print  '\n\t\t\t myVariable =', MainWindow.myVariable, '\n'

    def buttonB_func(self):
        print  '\n\t\t\t myVariable =', MainWindow.myVariable, '\n'
        MainWindow.myVariable=11
        print  '\n\t\t\t myVariable =', MainWindow.myVariable, '\n'