惊人的Python程序输出

时间:2011-05-31 07:25:03

标签: python

我刚刚开始学习Python,看到以下程序的输出后,我感到有点困惑:

#!/usr/bin/python
# Function definition is here
def changeme( mylist ):
    "This changes a passed list into this function"
    mylist = [1,2,3,4]; # This would assig new reference in mylist
    print "Values inside the function: ", mylist
    return

# Now you can call changeme function
mylist = [10,20,30];
changeme( mylist );

print "Values outside the function: ", mylist

函数内的值:[1, 2, 3, 4]
函数外的值:[10, 20, 30]

为什么值在函数之外:[10, 20, 30]而不是[1, 2, 3, 4],因为我们通过引用将参数传递给函数?

3 个答案:

答案 0 :(得分:4)

适合我,并有适当的缩进:

def changeme(mylist):
    mylist.append([1, 2, 3, 4])
    print "Values inside the function: ", mylist

mylist = [10, 20, 30]
changeme(mylist)
print "Values outside the function: ", mylist

输出:

Values inside the function:  [10, 20, 30, [1, 2, 3, 4]]
Values outside the function:  [10, 20, 30, [1, 2, 3, 4]]

请注意,在行尾允许使用 ,但不建议使用它们,因为它们没有用处并且使代码看起来不那么干净。此外,您可能正在寻找extend mylist方法而不是append

>>> mylist = [10, 20, 30]
>>> mylist.extend([1, 2, 3, 4])
>>> mylist
[10, 20, 30, 1, 2, 3, 4]

重新:更新

在更新的changeme功能中,您将丢弃对mylist的引用,并将其替换为您刚刚创建的新列表的引用。如果您保留对旧列表的引用,它将保持不变。这应该说明一点:

def changeme(mylist):
    myref = mylist
    mylist = [1, 2, 3, 4]
    print "myref: ", myref
    print "mylist: ", mylist

输出:

myref:  [10, 20, 30]
mylist:  [1, 2, 3, 4]

要获得所需的结果,请使用python slice notation

def changeme(mylist):
    mylist[:] = [1,2,3,4]

答案 1 :(得分:3)

通过分配值,您将定义一个新列表,而不是更新旧列表。

您可以使用id()功能进行检查。

答案 2 :(得分:1)

函数内的

mylist是一个局部变量。如果将新值绑定到局部变量,那么您只更改了局部变量的绑定。这不会影响碰巧绑定到同一对象的任何其他变量。

如果你已经改变了对象本身,例如通过附加到列表,对于使用同一对象的任何内容都可以看到。