列表函数没有用冒å·å“应

时间:2018-06-03 12:12:38

标签: python

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))

2 个答案:

答案 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次旋转。