匆匆又夏天 发表于 2020-8-30 21:17:27

关于python的列表

第一个程序
>>> list1 =
>>> list2 = list1[:]
>>> list2

>>> list3 = list1
>>> list3

list1.sort()
>>> list1

>>> list3


第二个程序
old =
new = old
old =
print(new)
打印结果是

为什么第二个程序的new列表不随着old的变化而变化,第一个却变化了。

Twilight6 发表于 2020-8-30 21:21:29

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等)都是在原列表上进行改变的,只改变本源,导致与其相关的都一起发生改变

匆匆又夏天 发表于 2020-8-30 21:23:29

Twilight6 发表于 2020-8-30 21:21
可以这样做




感谢! 那请问第一个的程序为什么会变呢也是让两个列表直接相等

Twilight6 发表于 2020-8-30 21:25:02

匆匆又夏天 发表于 2020-8-30 21:23
感谢! 那请问第一个的程序为什么会变呢也是让两个列表直接相等



第一个直接相等,两个列表都是指着列表 ,只是列表 有两个变量名 list1 和 list3 而已

所以此时对 list1 和 list3 其中一个进行 sort , 那么实际上都是对 进行排序,所以都会改变

1q23w31 发表于 2020-8-30 21:26:14

第一个程序,list3随list1变化,是因为在python中变量名可以看作一个标签,只是贴在某个对象上面
list1.sort()针对list1所指向的列表排序,而list3和list1指向的是同一个列表,所以list3会变

static/image/hrline/line6.png

第二个程序new = old这句话将old和new都指向同一个列表,
但之后old = 对old重新赋值,相当于只把old标签贴到上,而new所指向的对象不变,所以new不变

匆匆又夏天 发表于 2020-8-30 21:31:31

Twilight6 发表于 2020-8-30 21:25
第一个直接相等,两个列表都是指着列表 ,只是列表 有两 ...

感谢,懂了!

匆匆又夏天 发表于 2020-8-30 21:32:03

1q23w31 发表于 2020-8-30 21:26
第一个程序,list3随list1变化,是因为在python中变量名可以看作一个标签,只是贴在某个对象上面
list1.so ...

感谢!
页: [1]
查看完整版本: 关于python的列表