今天这篇文章是给大家分享一些云计算开发教程, 今天讲解的是: Python 自动化运维开发实战 Python 变量.
python 学习过程中会用到许多数据, 那为了方便操作, 需要把这些数据分别用一个简单的名字代表, 方便在接下来的程序中引用.
变量就是代表某个数据 (值) 的名称. 简单点说变量就是给数据起个名字
变量名称的命名:
由字母数字下划线组成的, 且不能以数字开头, 不能使用关键字, 区分大小写.
命名惯例:
以单一下划线开头的变量名 (_X) 不会被 from module import * 语句导入
前后有下划线的变量名 (X) 是系统定义的变量名, 对解释器有特殊意义
以双下划线开头, 但结尾没有双下划线的变量名 (__X) 是类的本地变量
通过交互模式运行时, 只有单个下划线的变量名 (_) 会保存最后表达式的结果
python 命名规范总结:
模块名: 小写字母, 单词之间用_分割, 比如 ad_stats.py
包名: 和模块名一样
类名: 单词首字母大写, 比如 AdStats ConfigUtil
全局变量名: 大写字母, 单词之间用_分割, 比如 UMBER COLOR_WRITE
普通变量: 小写字母, 单词之间用_分割, 比如 this_is_a_var
实例变量: 以_开头, 其他和普通变量一样, 比如_price _instance_var
私有实例变量 (外部访问会报错): 以__开头 (2 个下划线), 其他和普通变量一样
__private_var
专有变量: 开头, 结尾, 一般为 python 的自有变量, 不要以这种方式命名
__doc__ __class_
变量赋值:
是变量声明和定义的过程
单个变量赋值:
- #!/usr/bin/python
- -- coding: UTF-8 --
- counter = 100 # 赋值整型变量
- miles = 1000.0 # 浮点型
- name = "John" # 字符串
- print counter
- print miles
- print name
多个变量赋值:
Python 允许你同时为多个变量赋值.
例如:
a = b = c = 1
以上实例, 创建一个整型对象, 值为 1, 三个变量被分配到相同的内存空间上.
同时为多个变量赋不同的值.
例如:
a, b, c = 1, 2, "john"
以上实例, 两个整型对象 1 和 2 的分配给变量 a 和 b, 字符串对象 "john" 分配给变量 c.
变量存储数据的方式:
一般编程语言变量存储数据的方式:
变量是计算机内存中的一块区域, 变量可以存储规定范围内的值, 而且值是可变的.
在创建变量时会在内存中开辟一个空间. 基于变量的数据类型, 解释器会分配指定内存, 并决定什么数据可以被存储在内存中. 因此, 变量可以指定不同的数据类型, 这些变量可以存储整数, 小数或字符.
比如 c 语言在声明一个变量 a 之后, 会在内存中开辟出一块儿对应的空间, 在此空间中可以存储不同的值, 也就是给变量赋予不同的值
python 变量在内存中存储值得方式和其他编程语言不同:
在 Python 中, 变量名没有类型, 但对象有
变量名只是对对象的引用 (内部实现为指针)
python 中是以数据为主, 变量 a 只是相当于一个内存空间的标签, a=1 开辟一块空间存储 1, 之后重新复制 a=2 是重新开辟出新的空间存储 2, 变量名称 a 换了个位置指向新空间中的 2
同样的地址空间可以有两个或多个标签, 比如 a=1,b=1 实际上是 a 和 b 指向同一个地址空间
查看变量指向地址空间的地址: 使用 id(变量名称) 函数
- >>> a=1
- >>> id(a)
- 19882304
- >>> b=1
- >>> id(b)
- 19882304
上例发现同一个值赋值给不同变量, 实际地址空间未发生变化, 只是标签发生了变化
PYTHON 内部的引用计数 (SYS.GETREFCOUNT):
什么是引用计数器:
Python 内部记录着所有使用中的对象有多少引用. 一个内部跟踪变量, 称为一个引用计数器. 当对象被创建时, 就创建了一个引用计数, 当这个对象不再需要时, 也就是说, 这个对象的引用计数变为 0 时, 它被垃圾回收.(这个只是形象的说一下, 并不是严格的 100% 正确, 但是通俗的理解往往是最好的学习方式)
增加引用计数:
当对象被创建并 (将其引用) 赋值给变量时, 该对象的引用技术就是被设置为 1. 当同一个对象的应用或者是对象又被赋值给其他变量时, 或者作为参数传递给函数, 方法或类实例时, 或者被赋值为一个窗口对象的成员时, 该对象的一个新的引用, 或者称作别名, 就被创建 (则该对象的引用计数自动加 1)
减少引用计数:
当对象的引用被销毁时, 引用计数会减少. 最明显的例子就是当引用离开其作用范围时, 这种情况最经常出现在函数运行结束时, 所有局部变量都被自动销毁, 对象的引用计数也就随之减少.
当变量被赋值给另外一个对象时, 源对象的引用技术也会自动减 1
其他造成对象的引用计数减少的方式包括使用 del 语句删除一个变量, 或者当一个对象的引用计数在以下情况会减少:
一个本地引用离开了其作用范围, 比如函数结束
对象的别名被显示的销毁
对象的一个别名被赋值给其他的对象
对象被从一个窗口对象中移除
窗口对象本身被销毁
例子:
- import sys
- a="ab"
- sys.getrefcount("ab")
3 第一次结果为 3
- b="ab"
- sys.getrefcount("ab")
4 第二次结果 + 1
b=0 b 引用了其他的对象 (0), 对于 "ab" 来讲就取消了一个引用
sys.getrefcount("ab")
3 结果在上次引用的基础上 - 1
注意: 在交互式解释器中带空格的对象引用次数永远为 3, 但是在脚本中回归正常, 例如: #!/usr/bin/env python # coding=utf8 fdaf import sys print sys.getrefcount("ab cd") a="ab cd" print sys.getrefcount("ab cd") b="ab cd" print sys.getrefcount("ab cd") c=b print sys.getrefcount("ab cd")
垃圾收集:
不再被使用的内存会被一种称为垃圾收集的机制释放. 像上面说的, 虽然解释器跟踪对象的引用计数, 但是垃圾收集器负责释放内存. 垃圾收集器是一块独立的代码, 它用来寻找引用计数为 0 的对象, 他也负责检查那些虽然引用计数大于 0 但也该被销毁的对象. 特定情形会导致循环引用.
一个循环引用发生在当你有至少两个对象互相引用时, 也就是所说的引用都消失时, 这些引用仍然存在, 这说明只靠引用计数是不够的. Python 的垃圾收集器实际上是一个引用计数器和一个循环垃圾收集器. 当一个对象的引用计数变为 0, 解释器会暂停, 释放掉这个对象和仅有这个对象可访问的其他对象, 作为引用计数的补充, 垃圾收集器也会留心被分配的总量很大 (以及未通过引用计数销毁的那些) 的对象. 在这种情况下, 解释器会暂停下来, 试图清理所有为引用的循环.
来源: http://www.bubuko.com/infodetail-3090823.html