美文网首页
类,变量,迭代器

类,变量,迭代器

作者: 岛在深海处 | 来源:发表于2018-05-19 13:57 被阅读0次

1、变量

python中实际有4种变量,分别是全局变量,类变量,实例变量,局部变量。
- 全局变量:类之外的变量,例如:
a_list = [] #全局变量
class TestVariable:
    pass

在方法中给全局变量赋值需要使用global声明,例如:

a_list = []

def give_value():
    #a_list = [1, 2, 3] # 错误的做法,如果没有声明global,方法内的a_list相当于新定义的一个局部变量,此处赋值,并不会改变全局变量的值。
    global a_list
    a_list = [1, 2, 3] 

give_value()
print(a_list) #输出:[1, 2, 3] 

需要注意的是就算把a_list=[]注释掉,执行give_value()方法后print(a_list)同样会输出[1, 2, 3],这是因为我们在give_value()方法中用global声明了一个全局变量a_list,就算外面没有显示声明,a_list也已经变成了一个全局变量。 有时会出现容易混淆的情况,如下:

class TestVariable:
    b_list = []

    def give_b_value(self):
        global b_list
        b_list = [1, 2, 3, 4]

tv = TestVariable()
tv.give_b_value()
print(tv.b_list) #输出:[]
print(TestVariable.b_list) #输出:[]
print(b_list) #输出:[1, 2, 3, 4] 注意不管在哪里只要声明了global变量,就可以直接调用global声明的变量

TestVariable类中声明了类变量b_list但是方法中又声明了相同名字的全局变量,这两个b_list变量有明显的区别,一个是类变量,一个是全局变量。如果要改变类变量的值应该使用<类名.类变量>TestVariable.b_list而不是用global声明全局变量。

- 类变量:类里面方法之外的变量,例如:
class TestVariable:
    b_list = []

tv = TestVariable()
tv.b_list = [1, 2, 3, 4]
print(tv.b_list) #输出:[1, 2, 3, 4]
print(TestVariable.b_list) #输出:[]

tv1 = TestVariable()
print(tv1.b_list) #输出:[]

TestVariable.b_list = [1, 2, 3, 4, 5]
print(tv.b_list) #输出:[1, 2, 3, 4]
print(tv1.b_list)#输出:[1, 2, 3, 4, 5]

tv1.b_list = [1, 2]
print(tv1.b_list) #输出: [1, 2]

tv1.__class__.b_list = [1, 2, 3, 4, 5] #相当于TestVariable.b_list = [1, 2, 3, 4, 5]

print(tv.b_list) #输出:[1, 2, 3, 4]
print(tv1.b_list) #输出:[1, 2]

说明:
1.类的每个实例继承了b_list 属性及它在类中定义的值。

  1. 修改一个实例属性的值不影响其他实例,也不会修改类的属性。可以使用特殊的 class 属性来访问类属性(于此相对的是单独实例的属性)。
    如果修改类属性, 所有仍然继承该实例的值的实例 (如这里的tv1没有给b_list赋值之前) 会受影响。
    已经覆盖(overridden)了该属性(如这里已经赋值的tv1)的所有实例 将不受影响。
- 实例变量:每个实例的所拥有的变量

类中的每一个方法的第一个参数都是self,使用self.变量名来定义实例变量。

- 局部变量:方法里的变量

相关文章

  • 类,变量,迭代器

    1、变量 python中实际有4种变量,分别是全局变量,类变量,实例变量,局部变量。 - 全局变量:类之外的变量,...

  • 跟诸子学游戏 Lua基础

    1:使用闭包创建迭代器 2:泛型for保存状态变量和控制变量,将状态变量传入迭代器,进行迭代,这个属于无状态迭代器...

  • 5、迭代器实现

    闭包实现迭代器 迭代函数实现迭代器 --1,调用迭代函数,(把状态变量和控制变量当做参数传递给迭代函数) 状态变...

  • 设计模式之迭代器模式

    迭代器模式 迭代器接口 具体迭代器类 容器接口 具体容器类 客户端 个人理解 在java中的集合是迭代器模式的最好...

  • py3笔记27:迭代器

    1、迭代器 1.1 iter() 1.2 迭代器遍历 1.3 类作为迭代器使用 把类作为一个迭代器使用,需要类中实...

  • 迭代器模式

    Iterator(迭代器接口):ConcreteIterator(迭代器实现类):Aggregate(容器接口):...

  • php Iterator(迭代器)接口

    迭代器或类的接口。 scalar 标准变量 整型、字符串、浮点型等 输出结果: Traversable 预定义接口...

  • Python-学习之路-16 协程

    协程 迭代器 可迭代(iterable):可直接作用for循环的变量 迭代器(iterator):不经可以作用域f...

  • 迭代器模式(在对象的集合中游走,但是不暴露集合的实现)

    Iterator迭代器接口负责定义、访问和遍历元素的接口 ConcreteIterator具体迭代器类主要实现迭代...

  • std::auto (c++11)

    使用auto关键字定义变量时,编译器会自动根据上下文情况,确定auto变量的真正类型,在写for循环和stl迭代类...

网友评论

      本文标题:类,变量,迭代器

      本文链接:https://www.haomeiwen.com/subject/huuksxtx.html