鱼C论坛

 找回密码
 立即注册
查看: 2026|回复: 12

[技术交流] Python FAQ 015 变量赋值

[复制链接]
发表于 2020-3-4 17:31:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 qiuyouzhi 于 2020-4-29 10:51 编辑

Python FAQ 015 变量赋值


问题:
>>> a=2
>>> b=a
>>> a=3
>>> b
2

b 为什么还是 2 ?a 和 b 不是指向同一个地址吗?为什么 a 改变后,b 依旧不变?

但是……
>>> a=[1,2,3,4]
>>> b=a
>>> a.sort(reverse=True)
>>> b
[4,3,2,1]
这个为什么 b 就改了 ?

这是为什么呢?

(出自:https://fishc.com.cn/thread-159078-1-1.html

我的理解:

变量赋值就是贴标签嘛,你先将 a 贴上 2 的标签,再将 b 贴上 a 的标签

这时候 b = a,但是你将 a 的 2 标签撕了下来,这时候 b 虽然还是 a 的标签,

但 a 已经不再是从前那个 a 了,所以它的值不会变

而第二种则是改变 a 的标签,并没有撕下来,所以 b 也会跟着变

(还有一些补充,详情见10楼)

如果有纰漏,请在评论区指出!

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-4 17:34:13 | 显示全部楼层
一级标题和二级标题尺寸改一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-4 17:35:44 | 显示全部楼层
一个账号 发表于 2020-3-4 17:34
一级标题和二级标题尺寸改一下

我去怎么变这么大。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-4 17:38:50 | 显示全部楼层

没有啊
我一回复就没了
我也不知道是什么问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-4 17:42:58 | 显示全部楼层
qiuyouzhi 发表于 2020-3-4 17:38
没有啊
我一回复就没了
我也不知道是什么问题

审核
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-4 17:43:06 | 显示全部楼层
qiuyouzhi 发表于 2020-3-4 17:35
我去怎么变这么大。。。

我帮你排的版。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-4 17:43:57 | 显示全部楼层
zltzlt 发表于 2020-3-4 17:43
我帮你排的版。。。

。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-4 17:49:56 | 显示全部楼层
还需要理解得更深一点,更彻底一点,应该理解到 内存地址的变化 和 值的变化 才好。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-4 17:50:52 | 显示全部楼层
°蓝鲤歌蓝 发表于 2020-3-4 17:49
还需要理解得更深一点,更彻底一点,应该理解到 内存地址的变化 和 值的变化 才好。

那能写一下吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-4 18:43:35 | 显示全部楼层

Python的可变类型与不可变类型,在这里举例子吧。
1.
a = 3
b = 3

c = [1, 2, 3]
d = [1, 2, 3]

print(a, b)
print(c, d)
print(a is b)
print(c is d)

2.
a = 3
b = a
print(a, b)
print(a is b)
b = 5
print(a, b)
print(a is b)

c = [1, 2, 3]
d = c
print(c, d)
print(c is d)
d = [1, 2, 3, 4]
print(c, d)
print(c is d)

3.
a = 3
print(a)
print(id(a))
a += 2
print(a)
print(id(a))


c = [1, 2, 3]
print(c)
print(id(c))
c += [4]
print(c)
print(id(c))

因为在 python 里整型 是不可变类型,而列表是可变类型,所以接下来我直接以例子中的两个不同类型对象来分别代表可变类型与不可变类型。
1,对于不可变类型,值相同,地址也相同;对于可变类型, 值相同,地址不一定相同。
2,对于不可变类型,值不同,地址不同;对于可变类型,值不同,地址不同。
3,对于不可变类型,值变化,地址变化;对于可变类型,值变化,地址不变。
(注意:这里 “不同” 是 “不同”, “变化” 是 “变化”)

所以,对于不可变类型来说,不管是赋不同的值也好,还是在原值的基础上做些修改也好,变量的内存地址都会改变; 而对与可变类型来说,如果是在原值上进行修改而不是重新赋值的话,内存地址是不发生改变的。
要理解 重新赋值 和 在原值上进行修改 这两种方式,虽然都属于值的变化,可对于不同的类型来说,是不一样的。

评分

参与人数 1贡献 +2 收起 理由
zltzlt + 2 无条件支持楼主!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-4 18:48:32 | 显示全部楼层
好想加入你们的团队。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-16 11:43:45 | 显示全部楼层
wuqramy 发表于 2020-3-4 18:48
好想加入你们的团队。。。

可以呀,你去跟 qiuyouzhi 说一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-29 10:48:10 | 显示全部楼层
大佬,你第两个代码的第五行是不是都多了三个大于号?

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +2 收起 理由
qiuyouzhi + 2 + 2 + 2 感谢指出

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-26 22:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表