dark-river 发表于 2021-10-14 09:00:05

请教一个列表操作的基本问题

本帖最后由 dark-river 于 2021-10-14 09:04 编辑

将列表b整体作为元素append到列表a的末尾后,如果直接使用clear(),很奇怪已经append到列表A中的元素也被clear掉了。
>>> a=
>>> b=
>>> a.append(b)
>>> a
]
>>> b

>>> b.clear()
>>> a
]
>>>

但是,如果使用b=[],却对已经append到列表A中的内容没有影响,即使再使用了clear()方法也没有影响。

>>> a=
>>> b=
>>> a.append(b)
>>> a
]
>>> b=[]
>>> a
]
>>> b.clear()
>>> a
]

请大佬帮忙解释一下这里面的玄机,谢谢。

逃兵 发表于 2021-10-14 09:03:27

b被重新定义过
b = []
与原列表b = 切断了联系
改变b不会再影响a

dark-river 发表于 2021-10-14 09:28:31

本帖最后由 dark-river 于 2021-10-14 09:30 编辑

逃兵 发表于 2021-10-14 09:03
b被重新定义过
b = []
与原列表b = 切断了联系


那也就是说,即使将列表B append到列表A,此时A中的内容和外面的B是有关联的?
你这么一说,我改为使用copy()方法,就可以切段联系了
>>> a=
>>> b=
>>> a.append(b.copy())
>>> a
]
>>> b

>>> b.clear()
>>> a
]
>>> b
[]
>>>

逃兵 发表于 2021-10-14 09:30:52

dark-river 发表于 2021-10-14 09:28
那也就是说,即使将列表B append到列表A,此时A中的内容和外面的B是有关联的?

是的,就像班级里的学生,班级是总体,学生是个体
学生个体的变化会影响班级整体的情况
>>> a.append(b)
>>> a
]
>>> b.clear()
>>> a
]

傻眼貓咪 发表于 2021-10-15 11:25:21

解决方法:a =
b =
a.append(b[:]) # 这里只取 b 里面的值,不是 b 的内存地址
b.clear()
print(a) # 就算 b.clear() 了,a 还是保留了值]

Stubborn 发表于 2021-10-15 16:34:10

本帖最后由 Stubborn 于 2021-10-15 16:44 编辑

https://fishc.com.cn/forum.php?mod=viewthread&tid=203496&page=1#pid5596145   
关于我回复的11楼,讲的很精细了。
在python里面你要知道一个点,变量到底是什么?讲解的都时候,我更愿意叫他标签,贴在某个数据集上面。派森是通过标签找到数据集然后去操作。

如你发的代码,你分别建立两个数据集,。贴上ab两个标签,然后你通过b标签,把b标签的数据集打包放到a的数据集里面,但是此时你任然可以通过b这个标签去操作数据集,会影响到a。

第二段操作,你把b标签的数据集打包放到a的数据集里面,然后你干了什么呢?你又建议一个数据寄,在这个数据集上面贴个b的标签,告诉派森,如果有b的标签,可以到这里来(新建的数据集)自然而然影响不到a的数据集了。

另外说下5楼的,b[:]这个操作,会重新拷贝一个新的数据集,故而也不会影响

执行a.append(b)代码后,你可以很直观的看到是这样的,所以可以通过b去影响到a里面的数据,执行b=[],之后,b的指向就不是原来的列表了
页: [1]
查看完整版本: 请教一个列表操作的基本问题