新菜 发表于 2021-9-4 21:47:04

我想请问一下课后作业中一个赋值问题

在第十课的课后作业中有一道
>>> old =
>>> new = old
>>> old =
>>> print(new)
为什么这里print(new)为 而不是

然后在第十一课作业中
>>> list1 =
>>> list2 = list1[:]
>>> list2

>>> list3 = list1
>>> list3

>>> list1.sort()
>>> list1

>>> list3


在这里list1改变list3就随之改变   为什么在old赋值给了new 然后old改变了 print(new)没有改变

不能懒 发表于 2021-9-4 22:04:57

这个就等同余深拷贝和浅拷贝一样

Max472 发表于 2021-9-4 22:12:49

从这来看,”=“ 应该是像 C语言的指针一样,指向的是地址空间,而不是单纯的赋值,new = old 之后,new 和 old 指向同一片存储空间,但是又进行了 old = 这一操作,改变了 old 的空间,但是没有改变 new 的空间,所以 new 还是
同理,下边的因为都是指向 list1 的空间,也就是 的空间,所以排序了之后就都改变了,也不是都改变了,就像苏联成了俄罗斯,苏联人也都成了俄罗斯人

应该是这么理解,对 python 不是很懂

kogawananari 发表于 2021-9-4 23:06:51

old = 不行 old被修改了
按你的想法得写成 old[:] = 才可以

白two 发表于 2021-9-5 00:37:23

首先,python 会开辟一片内存来储存列表
然后创建一个变量 old 来指向这个列表
new = old 就是把 new 给指向该列表
这个时候你得清楚,new 和 old 两个变量本身没啥关系,只是因为它们指向同一个列表,才因此关联起来
所以这个时候你通过 old 去改变列表,那因为 new 也指向这个列表,所以 new 的值也会变,现在关系如下:



但是如果你用赋值操作 old =
那么相当于把 old 重新指向了新的列表,但是 new 还是指向原来的列表,所以现在关系变成了下图:


所以 old 和 new 之间就再也没有了任何关系,再无瓜葛。

新菜 发表于 2021-9-5 21:28:38

理解了,
old是被重新赋值了新的列表所以和new赋值的列表没有关系
list1和list3指向同一个列表,所以当通过bif改变list1的列表时,list3也的列表也被随之改变
>>> list1 =
>>> list3 = list1
>>> list1.append(6)
>>> list1

>>> list3

>>>
谢谢{:5_109:}
页: [1]
查看完整版本: 我想请问一下课后作业中一个赋值问题