python 编程出现这个问题咋办 UnboundLocalError: local variable 'step' referenced before assignment

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 编程出现这个问题咋办 UnboundLocalError: local variable 'step' referenced before assignment相关的知识,希望对你有一定的参考价值。

参考技术A if __name__ == '__main__':

这个是确保执行的本文件的主函数。
python在执行时,会默认给__name__一个值,就是__main__。
举个栗子:文件p1.py和p2.py,其中在p1中调用了p2.
那么p2中的if __name__ == '__main__':就不成立,因为在p2环境中,__name__为p2。
performance是一个装饰器,用于统计程序的执行时间。

装饰器(decorator)是一种高级Python语法。装饰器可以对一个函数、方法或者类进行加工。装饰器就是一个函数,与普通函数不同的是装饰器的输入参数是一个函数。
@performance
def factorial(n):
等价于
performance(factorial)(n)

python tips:类的绑定方法(bound)和非绑定方法(unbound)

类属性只有类及其实例能够访问,可以理解为一个独立的命名空间。

Python中类属性的引用方式有两种:

1. 通过类的实例进行属性引用,称为绑定方法(bound method),可以理解为方法与实例绑定在一起。

2. 通过类进行属性引用,称为非绑定方法(unbound method),方法没有与实例绑定。

在绑定方法中,为了与实例绑定,Python自动将实例作为方法的第一个参数,而非绑定方法则表现的像普通函数,和普通函数的区别在于它只能通过类来访问。

两种引用方式:

 1 class A:
 2     def test1(self):
 3         print(self)
 4 
 5 def main():
 6     a = A()
 7     a.test1()
 8     A.test1(a)
 9     A.test1(2)
10 
11 if __name__ == "__main__":
12     main()

输出结果:

1 <__main__.A object at 0x00000212C48D5908>
2 <__main__.A object at 0x00000212C48D5908>
3 2

上述代码中,类A有一个test1方法。两种引用方式说明如下:

1. 通过实例a来引用方法时,python自动将a作为第一个参数(self)传给方法test1。

2. 通过类来直接引用时,需要显式传给test1一个self参数,但是这个参数并不要求一定要是类的实例,传入其他值亦可(上述代码中传入的是2)。

引用方式的问题与优点:

 1 class A:
 2     def test2():
 3         print("hello")
 4     
 5     def test3(solf):
 6         print(solf)
 7 
 8 class B:
 9     pass
10 
11 def main():
12     a = A()
13     try:
14         a.test2()
15     except Exception as e:
16         print(e)
17     b = B()
18     A.test3(b)
19 
20 if __name__ == "__main__":
21     main()

输出结果:

1 test2() takes 0 positional arguments but 1 was given
2 <__main__.B object at 0x000001DFE1AC7898>

由于实例引用会隐式传入实例作为方法的第一个参数,所以当类的方法不接受参数的时候,使用实例就无法调用该方法。

类引用的显式传参没有要求,所以可以将A类的方法作用于B上。

类方法(classmethod)和静态方法(staticmethod):

 1 class A:
 2     @classmethod
 3     def test4(self):
 4         print(f"classmethod: self")
 5     
 6     @staticmethod
 7     def test5(self):
 8         print(f"staticmethod: self")
 9 
10 def main():
11     a = A()
12     a.test4()
13     A.test4()
14     a.test5(2)
15     A.test5(2)
16 
17 
18 if __name__ == "__main__":
19     main()

输出结果:

classmethod: <class __main__.A>
classmethod: <class __main__.A>
staticmethod: 2
staticmethod: 2

类方法和静态方法使用装饰器实现,和普通的方法有所区别。

从作用上看:

1. 类方法是只与类相关,而与类的实例无关的方法。

2. 静态方法是与类和实例都无关的方法。

从实现上看:

1. 类方法和静态方法统一了实例引用和类引用,两者都能通过两种引用方式调用。

2. 类方法永远隐式地使第一个传入的参数为类,静态方法所有参数都需要显示传入。

总结:

1. 类属性引用有两种,分为实例引用和类引用,对于方法属性,前者隐式传入实例作为第一个参数,后者类似于普通函数

2. self和cls是约定的实例和类的名称表示,并无强制性含义,类引用时可以传入任意值而不一定是类实例

3. 类方法与静态方法统一了两种引用方式,前者永远隐式传入类作为第一个参数,后者所有参数都需要显示传入。

以上是关于python 编程出现这个问题咋办 UnboundLocalError: local variable 'step' referenced before assignment的主要内容,如果未能解决你的问题,请参考以下文章

Python方法绑定——Unbound/Bound method object的一些梳理

Python UnboundLocalError 异常

python tips:类的绑定方法(bound)和非绑定方法(unbound)

导入项目后 出现Unbound classpath container: 'JRE System Library [jdk1.6.0_04]' in project '项目名&

eclipse 导入项目出现Unbound classpath variable: 'TOMCAT_HOME' in project XXX Problem

在ug中,项目初始化后,出现一串英语,不能往下做。咋办?