y = ['h','i','j']
def g(p):
z = p.pop(0)
p.extend(z)
return p
这些行ä¸ä¼šäº§ç”Ÿç›¸åŒçš„结果。那是为什么?
g(y[:]).extend(g(y))
与
相比g(y).extend(g(y))
ç”案 0 :(得分:1)
这归结为使用y
å’Œy[:]
之间的区别。
方括å·ä¸çš„冒å·æ˜¯åˆ‡ç‰‡ï¼Œä½†ç”±äºŽæ²¡æœ‰å¼€å§‹æˆ–åœæ¢å€¼ï¼Œåˆ‡ç‰‡æ˜¯æ•´ä¸ªåˆ—表的“切片â€ã€‚è¿™å¯èƒ½çœ‹èµ·æ¥ä¸ŽåŽŸå§‹åˆ—表相åŒï¼Œä½†å®ƒåªæ˜¯åœ¨ value ä¸ - 在幕åŽï¼Œå½“您æ‹æ‘„任何切片时,您将获得列表的副本,而ä¸æ˜¯å¯¹éƒ¨åˆ†çš„引用它的。
这归结为当您修改列表的副本时,原件ä¸å—å½±å“ã€‚è¿™å°±æ˜¯ä¸ºä»€ä¹ˆå½“æ‚¨ä¼ é€’y
的副本y[:]
时,结果会å‘生å˜åŒ–。
请考虑以下内容,以说明y
å’Œy[:]
ä¸çš„相åŒæ–¹å¼ã€‚
>>> l = [1,2,3]
>>> a = l
>>> b = l[:]
>>> a.append(4)
>>> b.append(5)
>>> l
[1, 2, 3, 4]
>>> a
[1, 2, 3, 4]
>>> b
[1, 2, 3, 5]
>>> id(l)
140460699987208
>>> id(a)
140460699987208
>>> id(b)
140460752668680
请注æ„修改a
如何更改l
ï¼Œå› ä¸ºå®ƒä»¬æŒ‡å‘相åŒçš„内å˜ä½ç½®ï¼ˆç”±id()
函数说明)。但修改b
确实ä¸ä¿®æ”¹l
ï¼Œå› ä¸ºå®ƒæ˜¯å¯¹ä¸åŒå†…å˜ä½ç½®çš„引用 - å› æ¤id()
的结果ä¸åŒã€‚
ç”案 1 :(得分:1)
y[:]
制作y
的副本,例如:
>>> id(y)
140532682743688
>>> id(y[:])
140532673103944
所以g(y[:]).extend(g(y))
的净效果是为列表旋转一次列表,在原始列表上旋转一次。在副本上执行时g()
的返回值未绑定到å˜é‡ï¼Œå› æ¤ç»“果将丢失,并且净效果是在原始列表上仅执行1次旋转。