鱼C论坛

 找回密码
 立即注册
查看: 735|回复: 8

关于变量的问题

[复制链接]
发表于 2019-3-2 13:30:26 | 显示全部楼层 |阅读模式

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

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

x
为什么复制一个列表list1,用list2=list1的时候list2会随着list1 变动,而list3=list1[:]不会随着list1变动,但是a=3,b=a,a=2这样的例子时,b却不会随着a变动呢
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-3-2 14:19:56 | 显示全部楼层
没人理我
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-2 14:31:46 | 显示全部楼层
本帖最后由 _谪仙 于 2019-3-2 14:33 编辑

因为复制可以得到一个对象的地址,因为list1所指向对象的地址没有改变,只是其中的值改变,则list2也会改变;

第二种是因为a所指向的对象地址发生了改变,而b还在指向3这个地址,所以b还是为3
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-2 16:06:37 From FishC Mobile | 显示全部楼层
在Python中,变量名都只是标签而已,列表中的切片复制才是真正的复制,普通的=复制只不过相当于将两个标签贴到一个内存上
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-3 08:56:44 | 显示全部楼层
BngThea 发表于 2019-3-2 16:06
在Python中,变量名都只是标签而已,列表中的切片复制才是真正的复制,普通的=复制只不过相当于将两个标签 ...

那为什么我举的后一个例子为什么b也是贴到了a的内存上,为什么a变了b不会跟着变呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-3 08:57:50 | 显示全部楼层
_谪仙 发表于 2019-3-2 14:31
因为复制可以得到一个对象的地址,因为list1所指向对象的地址没有改变,只是其中的值改变,则list2也会改变 ...

好复杂啊我什么时候才能知道他改变的是地址还是地址中的值呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-3 09:24:45 | 显示全部楼层
似乎可能也许看不懂,还需要继续学习啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-3 12:27:24 From FishC Mobile | 显示全部楼层
酥鱼酱 发表于 2019-3-3 08:56
那为什么我举的后一个例子为什么b也是贴到了a的内存上,为什么a变了b不会跟着变呢

因为是将标签撕下来贴到另一个地方
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-3 15:20:27 | 显示全部楼层
1. list2 = list1 时,你所说的list2随着list1改变而改变,这里的改变应该是指 append,extentd,pop, + 等改变方式,而不是 list1 = list3 这种。
至于为什么会随之改变,因为 list 是可变类型,就是说可以变(添加,减少,修改)的,变了之后它还是它,因为虽然值变了,但是id地址不会变,
  1. list1 = [1, 2, 3]

  2. list2 = list1

  3. list1.append(4)

  4. list1.extend([4, 5])

  5. list1.pop(2)

  6. list1[0] = 0

  7. list1.insert(3, 5)

  8. list1 = [4, 5, 6]
复制代码

在上面几种改变 list1 的例子中,除了 list1 = [4, 5, 6] 以外,list2都会随之改变而改变,而且 list1 的地址也不会改变,就因为它是可变类型。

2. list2 = list1[:] 是一种浅拷贝(自己百度),id地址是改变了的,所以它不再是它了。

3.
  1. a = 3
  2. b = a
  3. a = 2
  4. print(b)
复制代码

整型是不可变类型,你把 a 变(加减乘除)了,id地址也会随之改变,所以 a 不再是原来的 a了,但 b 还是原来的 a。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-14 06:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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