我将使用用户定义的函数重写列表,仅使用自身名称而不是任何内置列表函数,但这是行不通的。
使用内置函数(.append,del等)来更改列表确实可以,但是我仍然想知道为什么重写不起作用。我简化了代码以显示主要问题。
def function(y):
y=y[:3] # Rewrite the list
return y
y=[0,1,2,3,4]
function(y)
print(y)
预期:[0,1,2]
实际:[0, 1, 2, 3, 4]
答案 0 :(得分:3)
实际上,函数中的y和主函数中的y碰巧具有相同的名称,但不是相同的变量,它们只是对同一对象的引用。但是一旦在函数中为y赋值,就会创建一个新对象
为了更清楚地说明这一点,我将function()中的y重命名为yy
def function(yy):
yy=yy[:3] # Rewrite the list
return yy
y=[0,1,2,3,4]
y = function(y) # here I assign the result of the function call to y
print(y)
现在,第二种解决方案可能会使您感到困惑,因为它似乎与我之前所说的相矛盾。
def function(yy):
yy[:]=yy[:3] # Rewrite the list
y=[0,1,2,3,4]
function(y) # here nothing is assigned. function directly modifies the passed object
print(y)
实际上是下面的函数代码
y = y[:3]
创建一个新列表,其中包含y的前三个元素,并将其分配给变量y,但这是一个新对象。
代码y[:] = y[:3]
表示保留相同的对象y,但将其所有元素替换为y的前三个元素。
还是前面的代码,但是现在带有调试打印:
def function(y):
print("The id of y is ", id(y))
y=y[:3] # Rewrite the list
print("The id of y is ", id(y)) # you created a new object
return y
y=[0,1,2,3,4]
print("The id of y is ", id(y))
y = function(y) # here I assign the result of the function call to y
print(y)
print("The id of y is ", id(y)) # you got a new object, that is no stored in y
现在还有其他带有调试代码的代码: def函数(y): print(“ y的id是”,id(y)) y [:] = y [:3]#重写列表 print(“ y的id为”,id(y))
y=[0,1,2,3,4]
print("The id of y is ", id(y))
function(y) # here nothing is assigned. function directly modified the passed object
print("The id of y is ", id(y))
print(y)