为什么我不能在用户定义函数中重写列表?

时间:2019-09-29 00:51:14

标签: python function user-defined

我将使用用户定义的函数重写列表,仅使用自身名称而不是任何内置列表函数,但这是行不通的。

使用内置函数(.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]

1 个答案:

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