python_对变量的再认识

1.1.1.变量引用

人们经常使用“变量是盒子”这样的比喻,但是这有碍于理解面向对象语言中的引用式变量。python变量类似于Java中的引用式变量,因此最好把它们理解为附加在对象上的标注或便签。
在示例中所示的交互式控制台中,无法使用“变量是盒子”做解释。示意图说明了在python中为什么不能使用盒子比喻,而便签则指出了变量的正确工作方式。
示例:变量a和b引用同一个列表,而不是那个列表的副本

a = [1,2,3]
b = a
a.append(4)
print(b)
[1,2,3,4]

如果把变量想象为盒子,那么无法解释python中的赋值;应该把变量视作便利贴,这样示例中的行为就好解释了。
刚刚我们说明了两个变量引用同一个数据的情况,再看一种情况:一个变量先后引用不同的数据

  • 定义一个整数变量a,并且赋值为1


  • 将变量a赋值为2


  • 定义一个整数变量b,并且将变量a的值赋值给b



    变量b是第2个贴在数字2上的标签
    如果变量已经被定义,当给一个变量赋值的时候,本质上是修改了数据的引用

  • 变量不再对之前的数据引用
  • 变量改为对新赋值的数据引用
charles = {'name':'Charles L.Dodgson','born':1832}
lewis = charles
print(lewis is charles)
print(id(charles),id(lewis))
lewis['balance'] = 950
print(charles)
True
1636889017944 1636889017944
{'name': 'Charles L.Dodgson', 'born': 1832, 'balance': 950}
alex = {'name':'Charles L.Dodgson','born':1832,'balance':950}
print(alex == charles)
print(alex is not charles)
True
True

charles和lewis绑定同一个对象,alex绑定另一个具有相同内容的对象

1.1.2.==和is

==运算符比较两个对象的值(对象中保存的数据),而is比较对象的引用(标识)。通常,我们关注的是值,而不是标识,因此python代码中==出现的频率比is高。

1.1.3.函数的参数作为引用

python唯一支持的参数传递模式是共享传参。
共享传参指函数的各个形式参数获得实参中各个引用的副本。也就是说,函数内部的形参是实参的别名。
这种方案的结果是,函数可能会修改作为参数传入的可变对象,但是无法修改那些对象的标识(即不能把一个对象替换成另一个对象)。下面示例中有个简单的函数,它在参数上调用+=运算符。分别把数字、列表和元组传给那个函数,实际传入的实参会以不同的方式受到影响。

def f(a,b):
    a += b
    return a
x = 1
y = 2
print(f(x,y))
print(x,y)
a = [1,2]
b = [3,4]
print(f(a,b))
print(a,b)
t = (10,20)
u = (30,40)
print(f(t,u))
print(t,u)
3
1 2
[1, 2, 3, 4]
[1, 2, 3, 4] [3, 4]
(10, 20, 30, 40)
(10, 20) (30, 40)

数字x没变,列表a变了,元组t没变。

  • 数字的情况:



    相当于有隐含的代码a=x b=y函数调用结束后,a和b因为是临时变量,将不再指向数据1和2,但x和y依旧在引用着1和2,数据1和数据2因为还有变量在引用着自己所以并没有销毁。

  • 列表的情况:



    这里主要的区别之处在于

a += b

这行代码的不同。因为数字是不可变变量,所以,a+=b使得a指向了新的数据3;而列表是可变变量,所以a+=b的结果是就地修改列表,追加数据。

1.1.4.可变和不可变类型

  • 不可变类型,内存中的数据不允许被修改
    数字类型int,bool,float,complex,long(2,x)
    字符串str
    元组tuple
  • 可变类型,内存中的数据可以被修改:
    列表list
    字典dict
    自定义类型(class定义的类型,后面讲到)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念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

推荐阅读更多精彩内容