Python 变量

呃...Python压根就没有变量的概念!更不需要声明变量!

0X00、Java

在C/C++/Java等静态语言中,变量是面向内存的,声明定义一个变量需要:

  • 表明空间大小(Java整型int的范围 -2147483648~2147483647)
  • 确定存储的类型(int、float、string等)
  • 只能声明一次
// Java
int a;            // 声明一个变量a,表明类型和范围(-2147483648~2147483647)
a = 10;           // 给变量a赋值
// int a = 10;    // 声明并初始化变量
int a = 20;       // 会报错,变量a只能声明一次
a = 10.0;         // 会报错,变量a只能指向int类型

0X01、Python

Python只有name(名字)和object(对象)的概念

# python3
a = 10       # 指向int类型
a = 'test'   # 指向str类型,不会报错

这个语句中a是一个name,10和 "test" 是object
所有name在创建时必须关联到一个object

name可以在创建以后指向任何一个object(包括不同类型)

所以name本身没有类型,他关联的object是有类型的

ps: Python的猴子补丁的实现就是基于name - object 机制

a、Object

Python所有的数据都用objec(对象)表示的,object在创建时有以下属性(参见手册章3)

  • 唯一id,不可改变,通过id(object)查看
  • 类型,不可改变,int、stri、list等
  • 值,根据类型形式分为mutable(可变),immutable(不可变)

b、Name

objec(对象)是用来使用的,比如参与表达式运算,或作为函数参数传递,Python并不直接使用object,而是使用name,这种间接的方式(参见手册9.1)

  • 将name关联到object,然后name就可以用在表达式
  • 一个object可以被多个name关联
  • name总是存在于特定的namespace中

c、比喻说明

直观比喻:

  • 对象,就像一个人,出生时就分配身份证ID,这个终身不变。
  • 人可以有不同的name(张伟,儿子,父亲,老公)但在特定情境下(namespace)都指的是同一个人。
  • 不同情境下(namespace),name可能指代不同人,比如河南的张伟和河北的张伟不是同一个人。

代码说明:

class A(object):
    a = 1
    b = 1
class B(object):
    a = 'a'
   
print(id(A().a))    # 4305226112
print(id(A().b))    # 4305226112
print(id(B().a))    # 4339756032
"""
object 1和'test', 在python解释器中都有唯一id 4305226112、4339756032
在特定namespace(class A)中,name(a和b)都指向object 1
在不同namespace(class A, class B)中同一个name(a)指向不同object(1和'test')
"""
d = 2
print(id(d))      # 4305226144
d = 3
print(id(d))      # 4305226176
"""
按照C/C++/Java语言特性,变量d的id应该是一样的
但是在Python里却变了,这是因为d指向了不同的object(2和3)
个人理解Python的name有点像c语言的指针,但又不是一回事
"""

d、对象的可变与不可变

  • numbers(整数,浮点,布尔等)不可变,对!不可修改
  • list,dict之类的容器类对象,是可变对象

容器实际存储的是object(对象)的reference(引用),a=list[0] 返回的是list的0位置reference关联的object的值,list[0]=4,实际是将list的0位置reference改成关联到4这个object,也就是说,Python压根就不能直接修改基础对象的值,只能修改容器中的renference

e、Python数据模型的好处

相比C/C++/Java语言,Python的数据模型显得很特别。它让编程者,更关注与数据对象的操作,而不是数据存储。这使得编程者能快速的实现想法,而不过多专注于存储细节。

0X02、数据属性

class Test(object):
    class_attribute = 0                 # 类属性,类和类的所有实例对象都可以访问到

    def __init__(self):
        # 下面这些都属于实例属性
        self.public_attribute = 10      # 公有属性,
        self._attribute = 20            # 前置单下划线,(伪)私有属性,不能完全做到真正的私有,提醒使用者不要直接访问
        self.__attribute = 30           # 前置双下划线,私有化属性无法在外部直接访问, 需要通过 class name 访问
        self.__name__ = 40              # 前后双下划线,系统定义名字,__xxx__对Python 来说有特殊含义,对于普通的变量应当避免这种命名风格
        self.class_ = 50                # 后置单下划线,用于避免与Python关键词的冲突

a、类属性

class_attribute 这种属性是类属性,归Test类所有,虽然类的所有实例对象也都可以访问到,但是实例对象对类属性的操作,只能作用于该实例对象,不能作用于其他实例对象,但是类对类属性的操作,作用于所有类的实例对象。

t1 = Test()
t2 = Test()
print(Test.class_attribute,
      t1.class_attribute,
      t2.class_attribute)
# output 0 0 0
Test.public_attribute2 = 1000       # 添加类属性
t1.public_attribute3 = 10000        # t1添加类属性
print(t1.public_attribute2, t2.public_attribute2)
# output 1000 1000
print(t2.public_attribute3)         # public_attribute3只在t1,t2会报错
del Test.public_attribute2          # 删除类属性

b、实例属性

print(t1.public_attribute)          # 10
print(t1._attribute)                # 20
print(t1._Test__attribute)          # 30
print(t1.__name__)                  # 40
print(t1.class_)                    # 50

0X03、参考

Python3中文文档3.1

Python3英文文档9.1

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355

推荐阅读更多精彩内容

  • Python 变量类型 作者:杨梦鸽 校对:翟舒青 变量存储在内存中的值。这就意味着在创建变量时会在内存中开辟一个...
    木易林1阅读 234评论 0 0
  • 风格指南 Python风格指南 注释 注释解释器不会去执行,直接跳过 注释的写法 行注释:以井号(#)开头 可以单...
    nullnone阅读 331评论 0 0
  • 程序就是用来处理数据的,而变量就是用来存储数据的 目标 变量定义变量的类型变量的命名 变量定义 在 Python ...
    wqjcarnation阅读 1,037评论 1 1
  • 每个人的肥胖,都是有原因的,而遗传只占了20%左右的因素,剩下的80%都是后天造成。无论是先天还是后天,只要不是病...
    可乐别加冰阅读 408评论 1 1
  • 姓名:顾君 单位:宁波大发化纤有限公司 学习组:第234期努力一组 【日精进打卡第5天】 【知~学习】 《六项精进...
    JASONGU_2f28阅读 223评论 0 0