Fancy1998 发表于 2020-10-17 15:59:34

关于 python 列表的拷贝,和变量直接赋值的区别

    首先,我可以先理解 使用 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:02:31

因为他本来就不是list,
变量a和b的存储空间是不一样的,
除相互赋值以外,二者互不干扰

kogawananari 发表于 2020-10-17 16:04:00

>>> list1 =
>>> list2 = list1
>>> list1 = list1 +
>>> list1

>>> list2


这一点上有什么区别嘛{:10_289:}

kogawananari 发表于 2020-10-17 16:06:19

本帖最后由 kogawananari 于 2020-10-17 16:09 编辑

.sort()的本质是调用的魔术方法__setitem__方法
而字符串 元组 都没有__setitem__方法 这就导致了不同

jackz007 发表于 2020-10-17 16:09:08

本帖最后由 jackz007 于 2020-10-17 16:16 编辑

      赋值意味着新创建对象,本来变量 a 和 b 都指向整数对象 2,而经过 a = a + 2 的操作之后,内存中的 a 已经指向另外一个新的整数对象了,而 b 依然指向原来的整数对象 2,所以,a 和 b 的值就会不相同。
      另外,你说陈述的问题仅仅适合于列表、字典等可变对象,而且,仅限于通过对象的方法来修改对象,这样,原来的对象会发生一些改变,但不会有新对象产生,而赋值就不同了,在 Python 中,赋值意味着定义一个新对象。

kogawananari 发表于 2020-10-17 16:10:15

前面打错了是 __setitem__
你感受一下
a =
a[:1] = 5
print(a)
a =
a[:1] =
print(a)

昨非 发表于 2020-10-17 16:11:43

list1 = #二者地址相同,list1的变动影响list2
list2 = list1
del list1
print(list1)
print(list2)

a = "1234"#二者地址不同,a的变动不影响b
b = a
a = "234"
print(a)
print(b)

kogawananari 发表于 2020-10-17 16:14:14

昨非 发表于 2020-10-17 16:11


你这个
>>> a = '1234'
>>> b = a
b和a地址是一样{:10_294:}因为
>>> id(a)==id(b)
True

kogawananari 发表于 2020-10-17 16:18:54

kogawananari 发表于 2020-10-17 16:14
你这个
>>> a = '1234'
>>> b = a


>>> a =
>>> b = a
>>> a[:]=
>>> b

我要表达的是这个
这个切片赋值除了字符串和元组都支持 或者说字符串和元组没实现setitem{:10_289:}

昨非 发表于 2020-10-17 16:21:38

kogawananari 发表于 2020-10-17 16:14
你这个
>>> a = '1234'
>>> b = a


??等等??
=给a重赋值之后确实b没变啊{:10_284:}

kogawananari 发表于 2020-10-17 16:30:01

昨非 发表于 2020-10-17 16:21
??等等??
=给a重赋值之后确实b没变啊

{:10_331:}没事 我错乱了 没控制变量{:10_331:}

Fancy1998 发表于 2020-10-17 16:33:44

list1 =
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))



谢谢大家~我应该是明白了,确实是地址发生了变化。
但为什么要做这种设计啊....都用一个逻辑不行吗.....
页: [1]
查看完整版本: 关于 python 列表的拷贝,和变量直接赋值的区别