鱼C论坛

 找回密码
 立即注册
查看: 2191|回复: 11

[已解决]关于 python 列表的拷贝,和变量直接赋值的区别

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

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

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

x
    首先,我可以先理解 使用 list1[:]  是对 原来的列表进行了拷贝操作,在内存中创建了新的位置存同样的数据list2。
    所以,当我们使用 list1.sort()对 原列表进行修改,不影响list2.
   
     而赋值语句 =  ,是将不同的标签指向同一个地址,所以当使用 list3 = list1 时,再 list1.sort(),也会使得 list3改变。   
     那么问题来了:
    a = 2
    b = a

   a = a+2
   print(a)
   print(b)

    按照list的逻辑,输出值应该是 a = 4  ,b = 4 ............

    然后我就不知道怎么分析了。。。。。。。。
最佳答案
2020-10-17 16:11:43
list1 = [1,2,3,4]  #二者地址相同,list1的变动影响list2
list2 = list1
del list1[0]
print(list1)
print(list2)

a = "1234"  #二者地址不同,a的变动不影响b
b = a
a = "234"
print(a)
print(b)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-10-17 16:02:31 | 显示全部楼层
因为他本来就不是list,
变量a和b的存储空间是不一样的,
除相互赋值以外,二者互不干扰
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-17 16:04:00 | 显示全部楼层
>>> list1 = [1,2]
>>> list2 = list1
>>> list1 = list1 + [3,4]
>>> list1
[1, 2, 3, 4]
>>> list2
[1, 2]
这一点上有什么区别嘛
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-17 16:06:19 | 显示全部楼层
本帖最后由 kogawananari 于 2020-10-17 16:09 编辑

.sort()的本质是调用的魔术方法__setitem__方法
而字符串 元组 都没有__setitem__方法 这就导致了不同
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-17 16:09:08 | 显示全部楼层
本帖最后由 jackz007 于 2020-10-17 16:16 编辑

      赋值意味着新创建对象,本来变量 a 和 b 都指向整数对象 2,而经过 a = a + 2 的操作之后,内存中的 a 已经指向另外一个新的整数对象了,而 b 依然指向原来的整数对象 2,所以,a 和 b 的值就会不相同。
      另外,你说陈述的问题仅仅适合于列表、字典等可变对象,而且,仅限于通过对象的方法来修改对象,这样,原来的对象会发生一些改变,但不会有新对象产生,而赋值就不同了,在 Python 中,赋值意味着定义一个新对象。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-17 16:10:15 | 显示全部楼层
前面打错了是 __setitem__
你感受一下
a = [1,2]
a[:1][0] = 5
print(a)
a = [1,2]
a[:1] = [5]
print(a)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-17 16:11:43 | 显示全部楼层    本楼为最佳答案   
list1 = [1,2,3,4]  #二者地址相同,list1的变动影响list2
list2 = list1
del list1[0]
print(list1)
print(list2)

a = "1234"  #二者地址不同,a的变动不影响b
b = a
a = "234"
print(a)
print(b)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-10-17 16:14:14 | 显示全部楼层

你这个
>>> a = '1234'
>>> b = a
b和a地址是一样  因为
>>> id(a)==id(b)
True
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-10-17 16:18:54 | 显示全部楼层
kogawananari 发表于 2020-10-17 16:14
你这个
>>> a = '1234'
>>> b = a

>>> a = [1,2,3,4]
>>> b = a
>>> a[:]=[2,3,4]
>>> b
[2,3,4]
我要表达的是这个
这个切片赋值除了字符串和元组都支持 或者说字符串和元组没实现setitem
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-10-17 16:21:38 | 显示全部楼层
kogawananari 发表于 2020-10-17 16:14
你这个
>>> a = '1234'
>>> b = a

??等等??
=给a重赋值之后确实b没变啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-17 16:30:01 | 显示全部楼层
昨非 发表于 2020-10-17 16:21
??等等??
=给a重赋值之后确实b没变啊

没事 我错乱了 没控制变量
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-17 16:33:44 | 显示全部楼层
list1 = [1,3,2,]
list2 = list1[:]
list3 = list1

print(list2)
print(list3)

list1.sort()
print(list1,'1')
print(list3,'3')                           #list1 和 list3 任然指向同一地址
print(list2,'2')

print(id(list1))
print(id(list3))
print(id(list2))

a = 2
b = a

a = a+2                                   # 运算后a有了新的地址,而b任然指向原来a的地址
print(a)
print(b)

print(id(a))
print(id(b))


谢谢大家~我应该是明白了,确实是地址发生了变化。
但为什么要做这种设计啊....都用一个逻辑不行吗.....
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-18 07:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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