为什么可变变量的重定义不会传播回调用它们的函数?



为什么python不支持将mylist重新定义为[7,7,7,7]并将其传播回main((。但是如果我将每个索引更改为 7,例如 mylist[0] = 7 会使第二个打印语句 [7,2,3,4]

def changes(mylist):
mylist = [7,7,7,7]
def main():
mylist = [1,2,3,4]
print (mylist)
changes(mylist)
print (mylist)
main()

如果我使用它会起作用

def changes(mylist):
for x in range(len(mylist)):
mylist[x] = 7
def main():
mylist = [1,2,3,4]
print (mylist)
changes(mylist)
print (mylist)
main()

这是因为函数中的赋值changes创建一个新列表,其范围仅限于此函数。

您可以打印每个对象的id以便轻松查看:

def changes(mylist):
print('argument mylist id: {}'.format(id(mylist)))
mylist = [7,7,7,7]
print('7, 7, 7, 7 list id: {}'.format(id(mylist)))
def main():
mylist = [1,2,3,4]
print (mylist)
print('my list in main id: {}'.format(id(mylist)))
changes(mylist)
print (mylist)
main()
def changes(mylist):
mylist = [7,7,7,7]

在此代码中,mylist是一个局部变量。它在函数外部不可见。在函数的主体中,您分配了一个列表,但在外部,此列表不可见。

如果要保留更改,则应返回新列表。请参阅此代码:

def changes(mylist):
mylist = [7,7,7,7]
return mylist  # to persist the changes

因此,其余代码将是:

def main():
mylist = [1,2,3,4]
print (mylist)
mylist = changes(mylist)
print (mylist)
main()

最新更新