请教一个列表操作的基本问题
本帖最后由 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
]
请大佬帮忙解释一下这里面的玄机,谢谢。 b被重新定义过
b = []
与原列表b = 切断了联系
改变b不会再影响a 本帖最后由 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
[]
>>> dark-river 发表于 2021-10-14 09:28
那也就是说,即使将列表B append到列表A,此时A中的内容和外面的B是有关联的?
是的,就像班级里的学生,班级是总体,学生是个体
学生个体的变化会影响班级整体的情况
>>> a.append(b)
>>> a
]
>>> b.clear()
>>> a
] 解决方法:a =
b =
a.append(b[:]) # 这里只取 b 里面的值,不是 b 的内存地址
b.clear()
print(a) # 就算 b.clear() 了,a 还是保留了值] 本帖最后由 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]