3

如果我传入一个列表,我将无法理解 python 函数中的奇怪行为。我做了以下功能:

def func(x):
    y = [4, 5, 6]
    x = y

def funcsecond(x):
    y = [4, 5, 6]
    x[1] = y[1]

x = [1, 2, 3]

当我调用 func(x) 然后打印出 x 时,它会打印出 [1, 2, 3],就像 x 之前的方式一样,它不会将列表 y 分配给 x。但是,如果我调用 funcsecond(x),它会将 5 分配给 x 的第二个位置。为什么呢?当我分配整个列表时,它什么都不做,但是当我只分配一个元素时,它会更改我最初调用它的列表。非常感谢你,我希望你能理解我的意思,我很难用英语表达自己。

4

2 回答 2

9

前者重新绑定名称,后者改变对象。名称的更改仅存在于本地范围内,而变异对象在退出范围后仍保持变异。

于 2012-06-21T11:03:34.557 回答
4

这是因为 x 指向一个可变的对象。

def func(x): # here x is a local variable which refers to the object[1,2,3]
    y = [4, 5, 6]
    x = y  #now the local variable x refers to the object [4,5,6]

def funcsecond(x): # here x is a local variable which refers to the object[1,2,3]
    y = [4, 5, 6]
    x[1] = y[1]  # it means [1,2,3][1]=5 , means you changed the object x was pointing to

x = [1, 2, 3]
于 2012-06-21T11:06:40.690 回答