Jay8 发表于 2021-11-30 12:12:01

列表

>>> old =
>>> new = old
>>> old =
>>> print(new)



>>> old =
>>> new = old
>>> old.reverse()
>>> print(new)

>>> print(old)


为什么第一段代码的new 的值不是最后old的值
而第二段的new 又是改变之后old的值
求解答,谢谢

lightninng 发表于 2021-11-30 12:26:33

变量只是一个名字,他可以指向任何实体,当你使用=时,实际上是在改变变量的指向;而你对变量调用方法时,实际上是对变量指向的实体调用了该方法。
第一段代码发生的情况如下


第二段代码的情况,你先自己思考一下,对应着我上面说的对变量调用方法的情况。

luck78 发表于 2021-11-30 12:50:49

本帖最后由 luck78 于 2021-11-30 12:54 编辑

>>> old =
>>> new = old
>>> id(old)
2832595354432
>>> id(new)
2832595354432
在old 没有改变之前, old 和new共同一个id号,就像 一个瓶子 同时贴了old 和 new 这两个标签
>>> old =
>>> id(old)
2832595358976
>>> id(new)
2832595354432
old进行了内容修改,它的id值也发生了改变但new没改,就像重新拿了新的一个瓶子装了另一个东西,然后新瓶子标签贴了old,但是原来那个贴着new标签的瓶子还在,装着原来的内容。

old.reverse()
这里再查old和new的id值 都是一样的, 就像将一个贴着old 和new标签的瓶子颠倒了一下,瓶子里的内容并没有发时改变只是顺序改变了,所以old 和new的内容是一样的。

Jay8 发表于 2021-11-30 13:53:25

lightninng 发表于 2021-11-30 12:26
变量只是一个名字,他可以指向任何实体,当你使用=时,实际上是在改变变量的指向;而你对变量调用方法时, ...

谢谢老哥再次给我解答,大概懂了,意思是对变量调用方法时直接改变了的值,所以都代表这个列表的new和old 也都改变了对吗

Jay8 发表于 2021-11-30 13:56:18

luck78 发表于 2021-11-30 12:50
>>> old =
>>> new = old
>>> id(old)


感谢老哥的回答,老哥用id的方法来解答同时解决了我对new = old与new = old[:]有何不同的疑惑

lightninng 发表于 2021-11-30 15:01:48

Jay8 发表于 2021-11-30 13:53
谢谢老哥再次给我解答,大概懂了,意思是对变量调用方法时直接改变了的值,所以都代表这个列 ...

是这样的,=作为赋值用的运算符,其实是改变了变量的指向的,和这个相关的一个有意思的知识点叫做深拷贝和浅拷贝,也是很值得学习的一个东西,楼主可以自行百度学习一下~

Jay8 发表于 2021-11-30 15:55:40

lightninng 发表于 2021-11-30 15:01
是这样的,=作为赋值用的运算符,其实是改变了变量的指向的,和这个相关的一个有意思的知识点叫做深拷贝 ...

好的,非常感谢你的解答
页: [1]
查看完整版本: 列表