切片的分配点是什么?

eku*_*ser 1 python

我在pip来源中找到了这一行:

sys.path[:] = glob.glob(os.path.join(WHEEL_DIR, "*.whl")) + sys.path
Run Code Online (Sandbox Code Playgroud)

据我了解,上面的代码行与下面的代码相同:

sys.path = glob.glob(os.path.join(WHEEL_DIR, "*.whl")) + sys.path
Run Code Online (Sandbox Code Playgroud)

有一个区别:第一种情况sys.path仍然指向内存中的同一对象,而第二种情况则sys.path指向由两个现有对象创建的新列表。

另一件事是,第一种情况比第二种情况慢两倍:

>>> timeit('a[:] = a + [1,2]', setup='a=[]', number=20000)
2.111023200035561
>>> timeit('a = a + [1,2]', setup='a=[]', number=20000)
1.0290934000513516
Run Code Online (Sandbox Code Playgroud)

我认为原因是在切片分配的情况下,来自的对象a(对对象的引用)被复制到新列表中,然后再复制回到调整后的大小中a

那么使用分片分配有什么好处?

Bar*_*mar 5

如果对同一列表还有其他引用,并且您希望所有引用都接受更改,则分配给切片将很有用。

因此,如果您执行以下操作:

bar = [1, 2, 3]
foo = bar
bar[:] = [5, 4, 3, 2, 1]
print(foo)
Run Code Online (Sandbox Code Playgroud)

这将打印[5, 4, 3, 2, 1]。如果您改为:

bar = [5, 4, 3, 2, 1]
print(foo)
Run Code Online (Sandbox Code Playgroud)

输出将是[1, 2, 3]