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)
请帮助我,因为我是新手 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)