UnboundLocalError:赋值前引用的局部变量'k'

时间:2016-09-20 15:55:51

标签: python

我已阅读StackQ1stackQ2但无法解决我的错误。 下面给出的程序正在给出

  

UnboundLocalError:在赋值

之前引用的局部变量'k'

我已将变量k设为global,但它无效。

class myClass:
    global k
    k=0
    def data(self):
        def data2(k):
                for j in range(5):
                    k=k+1
                    return k
        for i in range(5):
            k=k+1
            data2(k)

Obj = myClass()
print(Obj.data())

我也试过

k=0
class myClass:
#     global k

    def data(self):
        def data2(k):
                for j in range(5):
                    k=k+1
                    return k
        for i in range(5):
            k=k+1
            data2(k)

Obj = myClass()
print(Obj.data())

但不行。

3 个答案:

答案 0 :(得分:0)

class My_Class(object):
     def __init__(self, **kwargs):
         super(My_Class, self).__init__()
         self.k = "hello"
     def data(self, *args):
         print "call data"
         return self.k


my_class = My_Class()
print my_class.data() 

答案 1 :(得分:0)

解决问题并将其发布给新手

class myClass:
    k=0
    def data(self):
        def data2(k):
                for j in range(5):
                    self.k=self.k+1
                    return self.k
        for i in range(5):
            self.k=self.k+1
            data2(self.k)

Obj = myClass()
print(Obj.data()) 

归功于@Moses Koledoye和@ Abhishek

答案 2 :(得分:0)

对于我的解释,我重新注释并注释您的代码:

class myClass:  # <- [1]
    global k  # <- [2]
    k = 0  # <- [3]

    def data(self):
        def data2(k):  # <- [4]
            for j in range(5):
                k = k + 1
                return k  # <- [5]

        for i in range(5):
            k = k + 1  # <- [6]
            data2(k)


Obj = myClass()
print(Obj.data())

代码审查

[1]类名应根据PEP8推荐使用CamelCase。请注意,您的类应继承自object(在Python 2.7中)以使用(现代)新式类。

[2]全局变量k未在模块级别定义。你不能在Python中声明一个变量,你必须定义它。由于k看起来像一个整数,你可以写:

k = 0

[3]在这里,您定义了一个类变量。

Python使用magic methods    构造和初始化一个类实例。    您应该使用__init__方法初始化您的课程,如下所示:

class MyClass(object):
    def __init__(self):
        self.k = 0

[4]在这里,您可以在data方法中定义一个函数。你想让我做什么?一种新方法?

class MyClass(object):
    def data(self):
        def data2(k):  # <- [4]
            pass

[5]我认为你过早地回归:循环在第一次迭代时结束。记住你的缩进:

def data2(k):
    for j in range(5):
        k = k + 1
    return k  # <- [5]

[6] k函数中未定义局部变量data。 如果要使用模块级变量(并对其进行修改),则必须使用global关键字。

class MyClass(object):
    def data(self):
        global k
        for i in range(5):
            k = k + 1  # <- [6]
            data2(k)

让我们从tutorial开始。