Python程序的惊人输出

Python程序的惊人输出,python,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

我刚刚开始学习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]
,因为我们是通过引用将参数传递给函数的?

适用于我,具有适当的缩进:

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]]
myref:  [10, 20, 30]
mylist:  [1, 2, 3, 4]
请注意,尽管分号可以放在行的末尾,但不鼓励使用,因为分号没有任何作用,会使代码看起来不那么干净。另外,您可能正在寻找mylist的
extend
方法,而不是
append

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

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

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

Values inside the function:  [10, 20, 30, [1, 2, 3, 4]]
Values outside the function:  [10, 20, 30, [1, 2, 3, 4]]
myref:  [10, 20, 30]
mylist:  [1, 2, 3, 4]
要实现您想要的结果,请使用:


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


如果您对对象本身进行了变异(例如,通过添加到列表),则使用同一对象的任何人都可以看到该对象。

通过赋值,您定义的是一个新列表,而不是更新旧列表


您可以使用
id()
函数对它们进行检查。

我得到
[10,20,30,[1,2,3,4]]
这两种代码。我现在已经更新了正确的代码!!这让我感到惊讶/p@ThanksLazyr,谢谢你的解释,但我想知道,如果是C语言的情况,你期望的o/p是什么?它的行为和这里的行为一样吗?对不起,我不太明白你在问什么。你能试着重新表述一下吗?@Lazyr在C中,如果我们确实将数组名作为函数参数传递,那么我们对该数组执行的任何操作都会反映在原始数组中,这在Python中看起来是不同的…@AMIT Python变量更像C指针,而不是C变量。在函数的开头,
mylist
指向传递给函数的列表对象
[10,20,30]
。然后
mylist=[1,2,3,4]
mylist
应该指向一个新的列表对象
[1,2,3,4]
。要实现您想要的,您需要小心处理指向的对象,即调用其方法或分配给其属性。您还应该阅读python中的可变类型和不可变类型,因为它们在这些情况下的行为不同。我建议避免使用名称
mycopy
,因为它实际上不是任何内容的副本。:-)要更新传递的列表,您需要对其使用“破坏性”操作,并在适当位置更改列表:.append、.extend、slice assignment。