Python 中的本地和全局列表

Local and Global lists in Python

请帮助我,因为我是新手 python 当我调用此函数时,list1 的原始值发生变化

def mystery(list1):
  list1[0] , list1[1] = list1[1], list1[0]

list1 = [7,82,44,23,11]
mystery(list1)
print(list1) #prints [82, 7, 44, 23, 11]

它如何改变全局的值list1 如果我将函数更改为

def mystery(list1):
  list1 = list1 + list1[2:5]

然后我得到 list1 的全局值而不是更新后的值。

列表是 python 中的可变对象,因此如果您将列表传递给函数,您在函数中对列表所做的所有更改都将反映出来 everywhere/globally

如果您将一个可变对象传递给一个方法,该方法将获得对同一对象的引用,您可以随心所欲地改变它,但如果您在方法中重新绑定该引用,则外部作用域将一无所知关于它,完成后,外部引用仍将指向原始对象。

如果将不可变对象传递给方法,仍然无法重新绑定外部引用,甚至无法改变对象。[more details here]

也许只是 return 列表?

def mystery(list1):
    return list1 + list1[2:5]

list1 = [7,82,44,23,11]
list1 = mystery(list1)
print(list1)

list1 发生变化的原因是因为您实际上是在函数内部修改列表对象。

其实和全局变量/局部变量没有关系,如果你把函数里面的参数重命名为别的,还传入list1,list1会被修改。

如果您想要return一个新列表,您需要先创建一个列表副本,有很多方法可以做到这一点。 list(list1) 是一种方式。然后return函数末尾的列表。

如果我理解你的问题,你实际上想要将更多的值附加到传入的列表中,请使用 list1.append(...) 添加到列表的末尾。

并且由于您正在修改列表本身,因此它会在更大范围内发生变化。

但它仍然没有使用全局作用域,因为您只是在局部作用域中使用了同名的 var。

在python中,给一个变量赋值,比如a = 5意味着你在内存中为值5创建了一个对象。现在a是一个link 到持有 5 的那个对象(用外行的话)。如果您现在更改 a,比如 a = "something else",这会在内存中的其他地方为字符串 "something else" 创建一个新对象,现在 a 指向该对象。这就是您要更改 python 变量的数据类型的原因。

当您将某些内容传递给 python 函数时,link 就是传递的对象。所以当你调用mystery(list1)时,原来的link传递给了list1。因此,更改 list1 中的元素意味着您正在为原始 list1 中的特定元素分配新值。在这种情况下,无论您是在函数 mystery() 的内部还是外部,因为您将使用您创建的原始 link 来访问 list1 内部的元素来更改它。变化发生在 list1 内; list1 没有重新分配。

然而,当您在函数 mystery() 中执行 list1 = "something new" 时,您正在函数内部创建一个新变量 list1,该变量是函数的局部变量。你没有改变原来的 list1.

将可变对象传递给函数,然后在函数内部修改对象与直接修改对象的效果相同。

list1 = [1,2,3]

def func(list1):
    list1[0] = 5

>>>list1
[5,2,3]

这实际上与直接 运行 list1[0] = 5

相同

但是,如果将不可变对象传递给元组等函数,它将不支持项目赋值TypeError: 'tuple' object does not support item assignment。所以你需要构建一个新的不可变对象并 return 它。

>>> tup1 = (1,2,3) # doing tup1[0] = 5 will cause TypeError
>>> tup2 = tup1 + (5,)
>>> tup2
(1, 2, 3, 5)

放在函数中,

>>> def func2(tup1):
        return tup1 + (5,)

>>> func2(tup1=(1,2,3))
(1, 2, 3, 5)