鱼C论坛

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

[已解决]变量赋值

[复制链接]
发表于 2021-6-8 10:45:07 | 显示全部楼层 |阅读模式

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

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

x
list1 = ["1","2","3","4"]
list2 = list1
list1.append('5')
list2.append('6')
print(list1)
print(list2)

这段代码得到的两个列表是相同的,都是['1', '2', '3', '4', '5', '6']。我的问题是既然list2 = list1表示将 list1 这个变量赋值给 list2,为什么增加 list2 列表中的元素也会改变 list1?
最佳答案
2021-6-8 11:01:42
本帖最后由 Twilight6 于 2021-6-8 11:04 编辑


因为 list1、list2 这两个变量所指向的 id 即内存地址相同

你的 list1 = ["1","2","3","4"] 实际上是将列表  ["1","2","3","4"] 的内存地址赋值给 list1

而你  list2 = list1 此时也是将 列表  ["1","2","3","4"] 的内存地址赋值给 list2

所以 list1、list2 都指向这个地址的数据,只要列表  ["1","2","3","4"] 发生改变,指向这个内存地址的变量肯定随之改变

你后来的 int 这些是因为是不可变对象,Python 会将不可变变量相同的值指向同一内存地址,节省内存消耗,而不同的值肯定需要重新开辟内存

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

使用道具 举报

发表于 2021-6-8 10:48:36 | 显示全部楼层
>>> a=[]
>>> b=a
>>> id(a)
30430216
>>> id(b)
30430216
这里的a 和b 你可以简单理解为一个东西
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-8 10:50:52 | 显示全部楼层
list1 = ["1","2","3","4"]
list2 = list1
list1.append('5')
list2.append('6')
print(list1)
print(list2)
print(id(list1))
print(id(list2))
两个列表地址是一样的,所以你在哪个列表加元素都是一样的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-8 10:59:21 | 显示全部楼层
wp231957 发表于 2021-6-8 10:48
>>> a=[]
>>> b=a
>>> id(a)

a = 1
b = 2
b = a
b = 3
print(a)
print(b)

请问这段代码为什么得到的a和b的值不一样呢?a=1,b=3
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-8 11:01:13 From FishC Mobile | 显示全部楼层
Nakupenda_wewe 发表于 2021-6-8 10:59
请问这段代码为什么得到的a和b的值不一样呢?a=1,b=3

是的,你可以搜一下哈希
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-8 11:01:42 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Twilight6 于 2021-6-8 11:04 编辑


因为 list1、list2 这两个变量所指向的 id 即内存地址相同

你的 list1 = ["1","2","3","4"] 实际上是将列表  ["1","2","3","4"] 的内存地址赋值给 list1

而你  list2 = list1 此时也是将 列表  ["1","2","3","4"] 的内存地址赋值给 list2

所以 list1、list2 都指向这个地址的数据,只要列表  ["1","2","3","4"] 发生改变,指向这个内存地址的变量肯定随之改变

你后来的 int 这些是因为是不可变对象,Python 会将不可变变量相同的值指向同一内存地址,节省内存消耗,而不同的值肯定需要重新开辟内存

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

使用道具 举报

发表于 2021-6-8 11:06:46 | 显示全部楼层
相当于list1以及list2同指向一个地址,所以会发生改变
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-8 11:10:04 | 显示全部楼层
我明白了,谢谢大家!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-8 11:10:37 | 显示全部楼层
字符串是不可变的,所以你重新赋值b=3,得新生成一个内存地址,而列表是可变的,所以,list1和list2其实都是同一个列表,它并没有新生成一个列表,一直都一个内存地址一样的列表
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-15 17:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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