我在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 = [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]。
| 归档时间: |
|
| 查看次数: |
59 次 |
| 最近记录: |