python学习——基础(六)

python能够改变变量作用域的代码段有:lamaba、def、class

if/elif/else、for/while、try/except/finally不能改变变量的作用域范围,在这些代码段中的变量,外部也能访问;

变量的访问路径:

local:比如function中的变量所在的作用域就是local的。简称L
enclosing:某个function被嵌套后的上一层function的作用域。简称E
global:当前模块中的全局作用域。简称G
built-in:python内置作用域.简称B
对某个变量搜索的顺序是:local>enclosing>global>built-in。也就是LEGB

def片段:

a =100

def change():
    a = 200
    print a

if __name__ == ‘__main__‘:
    print a
    change()

结果:
100
200

结论:def代码段的a与全局的a是不同的作用域,互不干扰

a =100

def change():
    print a
    a = 200
    print a

if __name__ == ‘__main__‘:
    print a
    change()

结果:

UnboundLocalError: local variable ‘a‘ referenced before assignment

本地变量在分配前被调用:在def函数未被运行时先进行预编译;def片段中的第一个print a在分配之前就先访问,所以报错

想要避免这种问题:

a =100

def change():
    global a
    print a
    a = 200
    print a

if __name__ == ‘__main__‘:
    print a
    change()

结果:
100
100
200

另一种错误:

def change():
    a = 200
    print a

if __name__ == ‘__main__‘:
    print a
    change()

结果:

NameError: global name ‘a‘ is not defined

全局变量没有进行预编译,所以与之前报的错误提示不相同

类变量和实例变量:

实例变量访问:self.propertyName

类变量访问:className.propertyName

class Person:
    name = "class global name"

    def __init__(self, newPersionName):
        self.name = newPersionName

    def sayYourName(self):
        print ‘My name is %s‘%(self.name); # -> class global name
        print ‘name within class Person is actually the global name: %s‘%(name); #-> whole global name
        print "only access Person‘s name via Person.name=%s"%(Person.name); # -> class global name

def selfAndInitDemo():
    ApersionInstance = Person("instance name crifan")
    ApersionInstance.sayYourName()
    BpersionInstance = Person("instance name simith")
    BpersionInstance.sayYourName()
    print "whole global name is %s"%(name); # -> whole global name

if __name__=="__main__":
    selfAndInitDemo()

结果:

My name is instance name crifan
name within class Person is actually the global name: whole global name
only access Person‘s name via Person.name=class global name
My name is instance name simith
name within class Person is actually the global name: whole global name
only access Person‘s name via Person.name=class global name
whole global name is whole global name

实例变量如果与类变量同名,则实例变量优先级高于类变量;

实例变量新增不会改变类变量,而类变量的变化会直接影响到实例变量

class people:
    country = ‘china‘

p1 = people()

people.age = 10 # 类变量增加age
p1.name = ‘syc‘ # 实例变量增加name
p1.country = ‘japan‘ # 实例变量country进行修改
print p1.country # japan
print people.country # china
print people.age # 10
print p1.age # 10
print people.name # AttributeError: class people has no attribute ‘name‘
print p1.name # syc

关于python面向对象编程的链接:

http://www.cnblogs.com/dolphin0520/archive/2013/03/29/2986924.html

时间: 2024-09-30 09:54:13

python学习——基础(六)的相关文章

Python学习基础篇第一篇——快速入门(适合初学者)

一.Python学习基础篇第一篇--(快速入门) 建议从Python2.7开始学习,Python2.7可以支持扩展大量的第三方类库,是目前比较成熟的版本 编写代码的软件推荐将python自带的IDLE和PyCharm集成IDE结合起来使用 1.1 Python命令行 Python命令行将以 >>> 开始,比如 >>>print 'Hello World!' 对于验证简单的命令可以在python自带的IDLE中完成  1.2 在Python自带的IDLE写一段小程序 在所

Python学习笔记六:列表、元组、字典

学习其他语言很少关注数组是的结构是怎么回事,都是直接使用.Python定义了列表.元组.字典三种数据结构,是我们使用python的基础,因此有必要理解它们的含义,我想这个和python一切皆对象的思想有关.python的数据结构更加灵活. 1. 列表[lists] 序列是Python中最基本的数据结构.序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推. Python有6个序列的内置类型,但最常见的是列表和元组. 序列都可以进行的操作包括索引,切片,加

Python学习笔记六(常用模块、面向对象基础)

一.random模块 import random print(random.random()) #0-1之间的小数 print(random.randint(1,5)) #1-5之间(包括1和5)的整数 print(random.randrange(1,5)) #1-5之间(包含1,不好包含5)的整数 print(random.choice(['a','b','c'])) #给定列表中任意元素 print(random.sample(['a','b','c','d'],2)) #给定列表中任意n

python学习笔记六之模块下(基础篇)

shevle 模块 扩展pickle模块... 1.潜在的陷进 >>> import shelve>>> s = shelve.open("nb") >>> s['x'] = ['a','b','c'] >>> s['x'].append('d') >>> s['x'] ['a', 'b', 'c'] 解析:当你在shelve对象中查找元素的时候,这个对象都会根据已经存储的版本进行重新构建,当你将

《转》python学习--基础上

学习的python本来想自己总结,但是发现了一篇不错的大牛的博客,拿来主义,,又被我实践了 关于前两篇如果总结的不详细,因此把他人的转载过来 http://www.cnblogs.com/BeginMan/archive/2013/04/12/3016323.html 一.欲练此功,必先自宫 从现在起,就开始真正地接触她了,或许很多人像我一样,不知道如何去快速掌握一门新的编程语言,今天贴出来一些建议,方便大家看看,这也是学习之前的十分重要的事情.虽然"欲练此功,必先自宫"太夸张,但是在

Python学习-基础篇1

一.变量: 1)变量定义规范: #1. 变量名只能是 字母.数字或下划线的任意组合#2. 变量名的第一个字符不能是数字#3. 关键字不能声明为变量名['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'exec', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda',

python学习基础篇(一)

一:机器码和字节码 机器码计算机能够直接识别,字节码计算机不能直接识别. 高级语言:例如Python java c# php c++(字节码) 低级语言:c,汇编(机器语言) 二:语言之间的对比 java的执行效率比Python的执行效率高,但比Python的开发效率低. PHP类:适合于写网页 Python,java:可以写网页,也可以写后台 三:Python基础 python种类:jpython javascriptpython  pypy(cpython开发的Python) python的

python学习-基础和运算符

接下来是第二天的学习,关于基础和运算符部分,先放思维导图: while循环 (1)while循环,写完条件判断后加冒号":",再另起一行空4个空格写循环具体逻辑 while True: print('人生苦短,我也有python') 执行结果,将循环打印: 此外python中while有pass的写法,直接跳过本次循环,直接java中好像是没有. # 添加pass的写法,执行到pass,直接过,java中好像没有pass的写法 count = 0 while count < 10

python学习-基础-day1

17年4月中旬在51cto上报名了老男孩PYTHON高级自动化开发的课程,此随笔为记录学习中的有意义的东西(自我感觉有意义) 一.pycharm的基本配置与使用 之前自学过一段时间,一直用的自带的IDLE和notepad++,现在开始用pycharm,但是很不熟悉,随着使用不断补充和修改 开始可以设置字体.样板等,网上都很容易搜到 1.setting--editor--file and code template ,找到Python script,可以为新建的Python文件定义模板,只有再次新