我被要求进行编码测试,但不知道答案。有人有主意吗?[:] = b和a = b [:]之间的区别? (Python)
回答
[:]
是切片运算符。
当它位于左侧时,它会覆盖列表的内容而不创建新的引用。
当它在右侧时,它会创建一个具有相同内容的列表副本。
哦,好吧,现在有道理。为了澄清,在做一个[:] = b时,id(a)不会改变。 id(a)在执行a = b [:]时发生变化。为什么一个人可能比另一个更好? – user701632
是的,你明白了。如果'c'也引用与'a'相同的列表,那么您可能需要更改内容,以便两个变量都引用更新后的列表。 – recursive
在这两种情况下,最终列表a
是列表b
的副本。但用于实现这一点的方法已经改变。
a[:] = b
修改列表a
,使其具有相同的元素b
a = b[:]
产生一个新的列表,它是b
副本,并替换列表a
所不同的是,我们是否已经修改现有的列表或创建一个新的列表。
要看到其中的差别:
a = range(3)
b = range(4)
c = a # c and a now share the same list
a[:] = b
print "a", a
print "b", b
print "C", c
所有三个列表将打印出来的一样。 C和一个共享相同的对象,所以,当a
被修改,以便为c
a = range(3)
b = range(4)
c = a # c and a now share the same list
a = b[:]
print "a", a
print "b", b
print "C", c
现在Ç不会打印出相同的。作业后,a
和c
没有共享同一个对象。
快速,a[:] = b' is probably a little faster then
a = b [:]`。第一种形式不必创建新的列表对象,它只能修改现有的列表。其中很大一部分是它可以重新使用列表已经拥有的内存,而不是分配新的内存。
a = b[:]
呼叫或者在b
__getslice__
或__getitem__
并将结果a
分配。在几乎所有情况下(例如,列表,元组和其他序列类型),这会生成序列的浅表副本;我不知道任何没有实现这种行为的类,但是你可以有一个用户定义的类型来做一些不同的事情。之前提到旧值a
的任何其他对象将继续引用旧值。
a[:] = b
,在另一方面,来电__setslice__
或__setitem__
取代的a
与那些序列b
的元素的子集。在这种情况下,如果a
的序列类型表现良好,则将替换整个a
,因为没有端点的范围:
表示整个序列。这里的区别是,不可变类型(如元组)不会允许您执行__setslice__
(例如通过抛出TypeError
异常)。由于底层对象正在被修改,因此之前提到a
的任何其他对象也将被更新。
对于可变类型如list
,的a = b[:]
结果将是相同的a[:] = b
,在a
将是b
浅表副本;对于不可变类型,如tuple
,a[:] = b
无效。对于糟糕的用户定义类型,所有投注都关闭。其他对象引用a
- 与a = b[:]
相同,它们指的是原始值(a
),但a[:] = b
指向修改后的对象(b
的浅拷贝)。
- 1. a + b和.__之间的区别__(b)
- 2. a + = b和a = + b之间的区别是什么,a ++和++ a?
- 3. ||之间的区别a = b和a = a || b在红宝石?
- 4. Kleene明星在编程。 (a | b)*和a * b *之间的区别?
- 5. a [:] = b和a = b之间的区别是什么?
- 6. Scala中f(a,b)和f(a)(b)之间的区别
- 7. 在PHP OOP中$ a =&$ b,$ a = $ b和$ a = clone $ b之间的区别OOP
- 8. [abc]和(a | b | c)之间的区别
- 9. a // b和int(a/b)之间有什么区别?
- 10. (a不在b)与(不在b中)之间的区别。 Python
- 11. 区别 “A级; B类” 和 “类A :: B”
- 12. a,b = b,a + b和a = b,b = a + b在fibonacci中的区别是什么[Python]
- 13. double a = a + int b和int a + = double b之间的区别是什么?
- 14. d.update(dict(a = 1,b = 2))和d.update(dict('a'= 1,'b'= 2)之间有什么区别)
- 15. val b = a(a是一个Array)和val b = a.clone()之间的区别是什么?
- 16. MySQL:`... ADD INDEX(a);之间的区别... ADD INDEX(b);`和`... ADD INDEX(a,b);`?
- 17. A == B对B == A,有什么区别
- 18. Java中a + = b和a = a + b的区别
- 19. [b] [b = a,0]如何在a和b之间交换?
- 20. MatLab中的[A,B]和[A; B]有什么区别?
- 21. '(a b c)和(list'a'b'c)之间的区别是什么?
- 22. C++两个向量之间的区别<MyType*> A和B
- 23. 复制/ a和复制之间的区别/ b
- 24. tmux中的'C-b d'和'C-b D'之间的区别
- 25. 在git中,A..B和A ... B有什么区别?
- 26. swap(int&a,int&b)和swap(int * a,int * b)。有什么区别?
- 27. `从abc import a,b`和`from abc import(a,b)`有没有区别?
- 28. flash(a,b)和flash()。put(a,b)在PlayFramework中有什么区别?
- 29. GROUP BY(A,B)和(B,A)
- 30. SqlAlchemy如何查询列A == a和B == b和A == b和B == a
可能重复[在Python中列表和列表\ [:\]有什么区别?](http://stackoverflow.com/questions/4081561/what-is-the-difference-between-list-and -list-in-python) –
@Ignacio:不,这不是重复的 - 该问题没有提到'a [:] = b'构造。 –
@Adam:甚至没有开始的部分“分配...时”? –