Python列表赢得';完成此操作后,无法重置

Python列表赢得';完成此操作后,无法重置,python,random,Python,Random,我正在通过以下函数运行一个空列表,列表为gp。其想法是在列表的末尾添加一个字母,然后在长度达到9时将其重置。但是,只要gp达到9个字符,它就会停止追加新字母。 def upd(总成): gp.append(random.choice(string.letters)) 如果len(gp)>9: gp=[] 设置gp=[]不会改变列表gp,它只是将局部变量gp重新绑定为空列表。外部列表(在gp中传递给函数)不受此重新绑定的影响 您需要做的是从列表中显式删除这些项。您可以一次删除所有项目,如下所示:

我正在通过以下函数运行一个空列表,列表为
gp
。其想法是在列表的末尾添加一个字母,然后在长度达到9时将其重置。但是,只要
gp
达到9个字符,它就会停止追加新字母。

def upd(总成):
gp.append(random.choice(string.letters))
如果len(gp)>9:
gp=[]

设置
gp=[]
不会改变列表
gp
,它只是将局部变量
gp
重新绑定为空列表。外部列表(在
gp
中传递给函数)不受此重新绑定的影响

您需要做的是从列表中显式删除这些项。您可以一次删除所有项目,如下所示:

def upd(gp):
    gp.append(random.choice(string.letters))
    if len(gp) > 9:
        gp[:] = []

现在,这将使列表
gp
发生变化,有效地删除其所有项。还有其他方法可以做到这一点,例如,
del gp[:]
也会起作用,在Python 3中,
gp.clear()
(谢谢@PeterDeGlopper)。

设置
gp=[]
不会改变列表
gp
,它只是将局部变量
gp
重新绑定为空列表。外部列表(在
gp
中传递给函数)不受此重新绑定的影响

您需要做的是从列表中显式删除这些项。您可以一次删除所有项目,如下所示:

def upd(gp):
    gp.append(random.choice(string.letters))
    if len(gp) > 9:
        gp[:] = []

现在,这将使列表
gp
发生变化,有效地删除其所有项。还有其他方法可以做到这一点,例如,
del gp[:]
也可以,Python 3中的
gp.clear()
(谢谢@peterdegloper)。

@mhawke有答案——我只想指出,这是具有隐式引用语义的语言中常见的新手错误(变量和参数充当对真实对象的引用,而不是对该对象的值的引用,但是对于大多数操作,隐式解引用的作用不同于从另一个隐式引用指定给对象,它复制的是引用而不是对象)当然,这也有好处——引用传递速度快、成本低,隐式引用减少了混乱等。@mhawke有答案——我只想指出,这是具有隐式引用语义的语言中常见的新手错误(变量和参数充当对真实对象的引用,而不是对该对象的值的引用,但是对于大多数操作,隐式解引用的作用不同于从另一个隐式引用指定给对象,它复制的是引用而不是对象)当然,它也有一些优点——参考文献传递速度快,成本低,隐含的参考文献减少了混乱等。