在Python局部和全局列表

问题描述 投票:0回答:5

请帮助我,因为我是新当我调用这个函数的list1的原始值更改到Python

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 python-3.x list global-variables local-variables
5个回答
1
投票

究其原因列表1正在发生变化是因为你实际上是修改函数内的列表对象。

这真的有全局/局部变量什么待办事项,如果你改名为参数的函数里面别的东西,并在列表1还通过了,列表1将被修改。

如果你想返回一个新的列表,你需要首先创建列表的副本,有很多方法可以做到这一点。 list(list1)是单向的。然后return在函数的最后名单。

如果我理解你的问题,你需要一些更多的价值实际上追加到列表中的传递,使用qazxsw POI添加到列表的末尾。

既然你正在修改的列表本身,它会在更大的范围内改变。

但它仍然没有使用全球范围内,因为你仅仅使用与在本地范围相同名称的变种。


1
投票

也许只是返回列表?

list1.append(...)

1
投票

列表是在Python可变对象,所以如果你传递给一个函数列表,你对函数内部的名单将处处体现的所有更改/全球

如果你传递一个可变对象进入的方法,该方法获取对同一对象的引用,你可以把它发生变异,你的心脏的喜悦,但如果你重新绑定方法中的引用,外部范围将对此一无所知,并经过大功告成,外部引用仍然指向原来的对象。

如果传递不可变的对象的方法,仍不能重新绑定外部引用,并且可以甚至不发生变异的object.def mystery(list1): return list1 + list1[2:5] list1 = [7,82,44,23,11] list1 = mystery(list1) print(list1)


0
投票

在python,将值分配给像[more details here]可变装置正在创建在存储器中的对象的值5。现在a = 5是该对象保持5的链路(通俗地说)。如果您现在更改a,说a,这为在内存别处串a = "something else"一个新的对象,现在"something else"指向这一点。这就是为什么你会得到改变蟒蛇变量的数据类型。

当你传递的东西一个Python函数,该链接是通过在一个。所以,当你调用a,原链接mystery(list1)传递。因此改变在list1元素意味着你分配一个新的价值,在原有list1特定元素。不管你是在这种情况下,内部或功能list1之外,因为你将使用您创建访问内部mystery()元素原始链接去改变它。变化发生在list1内; list1没有得到重新分配。

然而,当你做你的list1功能list1 = "something new"里面,要创建哪些是本地函数的函数内一个新的变量mystery()。你是不是改变原有list1


0
投票

通过可变对象成一个函数,然后修改该对象的函数内部将具有直接修改对象相同的效果。

list1

这是因为直接运行list1 = [1,2,3] def func(list1): list1[0] = 5 >>>list1 [5,2,3] 同样有效

然而,如果你传递一个不可变对象到一个函数,如元组,它不会支持项目assignement list1[0] = 5。所以,你需要建立一个新的不可变对象,并将其返回。

TypeError: 'tuple' object does not support item assignment

把它在功能上,

>>> tup1 = (1,2,3) # doing tup1[0] = 5 will cause TypeError
>>> tup2 = tup1 + (5,)
>>> tup2
(1, 2, 3, 5)
© www.soinside.com 2019 - 2024. All rights reserved.