我刚刚开始学习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]
,因为我们通过引用将参数传递给函数?
答案 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
是一个局部变量。如果将新值绑定到局部变量,那么您只更改了局部变量的绑定。这不会影响碰巧绑定到同一对象的任何其他变量。
如果你已经改变了对象本身,例如通过附加到列表,对于使用同一对象的任何内容都可以看到。