鱼C论坛

 找回密码
 立即注册
查看: 2409|回复: 4

python数组拷贝问题

[复制链接]
发表于 2016-8-19 14:24:53 | 显示全部楼层 |阅读模式

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

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

x
>>> list1 = [1,2,3,4,5,6]
>>> list3 = list1
>>> list2 = list1[:]
>>> list1.reverse()
>>> list3
[6, 5, 4, 3, 2, 1]
>>> list2
[1, 2, 3, 4, 5, 6]
>>> old = [1,2,3,4,5]
>>> new = old
>>> old = [6]
>>> new
[1, 2, 3, 4, 5]
Question:
为什么对数组list1的修改直接造成list3的修改,但对数组old的修改,不改变数组new的值?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-8-19 14:29:50 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-19 15:02:59 | 显示全部楼层
python的变量分为可变变量和不可变变量。
整数,浮点数,字符串等都是不可变变量。
见下面的例子:
  1. >>> f = 3.14
  2. >>> id(f)
  3. 49471616
  4. >>> f = 2.71
  5. >>> id(f)
  6. 50008336
复制代码

重新赋值后,存放的地址改变了,即原址的数值不改变。

而列表,字典等是可变变量。再看个例子:
  1. >>> list1 = [1, 2, 3, 4]
  2. >>> id(list1)
  3. 49822896
  4. >>> list1[1] = 9
  5. >>> list1
  6. [1, 9, 3, 4]
  7. >>> id(list1)
  8. 49822896
复制代码

对列表的局部修改值,列表的地址不发生变化,即原址的值改变了。
再看看你第一个程序:
list3 = list1是对同一地址的值赋给两个变量,更准确的说是贴上两个标签。
list2 = list1[:]则是把list1的值赋给list2,但list2使用了一个新地址。这样当list1.reverse()时,list1跟着改变,而list2不变。
你第二个程序,则是由于old = [6]语句是整体修改,相当于不可变变量的重新赋值。
  1. >>> old = [1,2,3,4,5]
  2. >>> id(old)
  3. 49801936
  4. >>> old = [6]
  5. >>> id(old)
  6. 49801376
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2016-8-19 15:03:59 | 显示全部楼层
注意可变变量的局部修改和整体修改的差别。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-19 15:34:48 | 显示全部楼层
结合着冬雪雪冬版主详细的解答,再看下此图
list1.reverse()是对原数组进行变更,而list1和list3都指向了那个数组,所以是一起变
old = [6]相当于是在内存中新建了一个数组,让old指向它,而原来的数组还保留,所以new和old最终值不一样

搜狗截图16年08月19日1528_1.png
搜狗截图16年08月19日1531_2.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-22 07:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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