gpt4 book ai didi

python - python分配 "mylist[:] = somelist"与 "mylist = somelist"有何不同

转载 作者:太空宇宙 更新时间:2023-11-03 15:13:54 24 4
gpt4 key购买 nike

我正在使用 os.walk() 过滤目录组件:

exclude_dirs = ['a', 'b']
for root, dirs, files in os.walk(mytopdir):
dirs[:] = [d for d in dirs if d not in exclude_dirs] # 1. Works
dirs = [d for d in dirs if d not in exclude_dirs] # 2. Doesn't work

似乎第二个正在创建一个隐藏原始目录的新局部变量。第一个如何避免这种情况?

最佳答案

dirs[:] = ... 修改 dirs inplacedirs = ... reassigns the variable dirs 到一个新对象。 os.walk 访问的目录只有在 dirs 最初引用的对象被修改就地 时才会受到影响。

dirs[:] = ...slice assignment 的一种形式.

In [18]: dirs = range(10)

In [19]: dirs
Out[19]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

In [20]: id(dirs)
Out[20]: 158391724

此切片分配将 dirs[5:8] 中的值替换为 'hello' 中的字符。请注意,切片 (3) 中的项目数不需要等于分配 (5) 中的项目数。

In [21]: dirs[5:8] = 'hello'

In [22]: dirs
Out[22]: [0, 1, 2, 3, 4, 'h', 'e', 'l', 'l', 'o', 8, 9]

id不变:

In [23]: id(dirs)
Out[23]: 158391724

当省略开始和停止切片索引时,切片被认为是整个列表:

In [24]: dirs[:] = 'cheese'

In [25]: dirs
Out[25]: ['c', 'h', 'e', 'e', 's', 'e']

请注意,id 没有改变。这表明 dirs 指向同一个对象,并且修改已就地完成。

In [26]: id(dirs)
Out[26]: 158391724

相反,如果您将 dirs 重新分配给某个其他值,则 id 会发生变化,因为它现在指向不同的对象。

In [27]: dirs = 'spam'

In [28]: id(dirs)
Out[28]: 181415008

关于python - python分配 "mylist[:] = somelist"与 "mylist = somelist"有何不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23208611/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com