python如何分配" mylist [:] = somelist"不同于" mylist = somelist"

时间:2014-04-22 01:04:03

标签: python syntax slice

我使用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

似乎第二个是制作一个隐藏原始目录的新局部变量。第一个如何处理避免这种情况的事情?

1 个答案:

答案 0 :(得分:4)

dirs[:] = ...修改dirs inplace dirs = ... 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
相关问题