Future博弈 发表于 2020-6-9 15:46:02

新手求助

1.    >>> old = 2.    >>> new = old3.    >>> old = 4.    >>> print(new)得出的结果是 但是

a=[0,1,2,3,4,5b=ac=a.copy()del a[1'''   各变量值为:   a=   b=   c='''b.remove(4)'''   各变量值为:   a=   b=   c=感觉这个时候和上一例子一样,a不会变,只有b变

Twilight6 发表于 2020-6-9 15:46:41

你的排版有点怪...

Twilight6 发表于 2020-6-9 15:47:32

本帖最后由 Twilight6 于 2020-6-9 15:51 编辑

old =    #第一次赋值
new = old    #将old 赋值给new   这行代码就等价与new =
old =    #这里你的old重新赋值,就会覆盖原本的old 变量,但是new 来源还是
print(new)

你可以这样做
old =
new = old          #他们的根本来源都是
new.append(6)

print(old)



同理:
old =
new = old          #他们的根本来源都是
old.append(6)
print(new)



python中 变量都有id (通俗说就是来源,id(new)可以查询new的id)

id相同 他们就相当于捆绑在一起了   其中一个改变 另一个也会随之改变就像   量子纠缠

而你后面是 old = 是重新给old 赋值 python 就会重新赋予他一个id    就和先前的id 不同 new id 还是原来的old = 时候的id

而 copy 也就是浅拷贝,相当于只拷贝列表本身,但是内部的可变元素并没有与之拷贝成新的

同理 列表的大部分方法(如 romove、pop、insert、append、sort等)都是在原列表上进行改变的,只改变本源,导致与其相关的都一起发生改变

Future博弈 发表于 2020-6-9 15:50:08

第二段是
a=
b=a
c=a.copy()
del a
b.remove(4)
变量值为:   
a=   
b=   
c=
感觉这个时候应该和上一例子一样,a不会变,只有b变

heidern0612 发表于 2020-6-9 15:54:15

Future博弈 发表于 2020-6-9 15:50
第二段是
a=
b=a


你a和b指向的始终都是一个地址,所以操作a和操作b都是对一个地址进行操作的。

c浅拷贝了a一份,内存地址不同了,所以c没啥变化。

Twilight6 发表于 2020-6-9 15:55:22

Future博弈 发表于 2020-6-9 15:50
第二段是
a=
b=a


copy() 方法只拷贝列表,会生成新的 id 地址,你可以理解下3l,相当于列表切片方法[:]

Twilight6 发表于 2020-6-9 15:57:55

Future博弈 发表于 2020-6-9 15:50
第二段是
a=
b=a


copy不可变元素时候,你可以当作是把整个重新赋值给了变量举个例子:
a=# 这里面都是整型,是不可变元素
c=a.copy()# 这就相当于 c = ,和 a 不关联,前提是里面都是不可变元素

Future博弈 发表于 2020-6-9 15:58:20

Twilight6 发表于 2020-6-9 15:47
你可以这样做




嗯嗯 好的 我看懂了 = 就会重新给予一个id
感谢感谢{:10_298:}

Twilight6 发表于 2020-6-9 15:58:56

Future博弈 发表于 2020-6-9 15:58
嗯嗯 好的 我看懂了 = 就会重新给予一个id
感谢感谢

哈哈 好聪明!~{:10_298:}理解的好快

Twilight6 发表于 2020-6-18 20:51:27

还有这 还有这 哈哈哈 {:10_281:}~~~~
页: [1]
查看完整版本: 新手求助