在函数中创建一个空列表并将其传递给全局范围。(在函数中初始化空列表)

KevOMalley743

我想创建一个函数,当我运行它时,它会生成一个列表并在该列表中添加一个项目,所以基本上我会向这个函数传递两个参数,第一个是我想要列表的名称,第二个是我想添加到列表中的项目。我想把它作为一种学习练习来做,我已经构建了一个几乎可以完成我想要它做的功能的函数。

def addlst(l, item):
        """add an item to a list"""
        l = list()#this line essentially does nothing. 
        if type(item) == str:    
            l.append(item.capitalize())
            return l
            print(l)
        else:
            l.append(item)
            return l
            print(l)

如果我通过这样的事情:

addlst(people, 'kev')

我收到错误:

NameError: name 'people' is not defined

但显然,如果我将人员定义为空列表,它工作正常。

我正在做的事情真的可能吗?我知道,当它站在这条线上

l = list()

只会先清空列表,因此 append 函数将无用(我必须添加另一个子句来检查列表是否已经存在)但我的问题实际上是关于在函数中初始化一个空白列表,然后将其返回给全球范围。

切普纳

首先:函数永远不应该将新名称注入调用范围。

  1. 如果该函数与全局变量一起使用,则需要对其进行记录,并且调用者必须在调用它之前确保该全局变量存在。

  2. 如果函数接受一个参数,则有两种选择。一,你可以改变它并让你的函数 return None,或者你可以根据参数创建一个值并返回它,保持参数不变。很少,如果有的话,你的函数应该修改一个参数返回一个值。

  3. 如果您的函数返回一个新列表,您可以选择修改一个列表,或在您的函数中创建一个全新的列表。

不相关,但你不应该关心它的类型item什么,只关心它有一个capitalize你可以调用方法。去尝试一下; 如果没有,它会引发一个AttributeError你可以捕捉到的,在这种情况下,你可以直接使用item


综上所述,我推荐第三种方法。add_to_list将一个项目作为第一个参数,一个可选列表作为第二个参数。如果没有给出列表,该函数将创建一个新列表。在任何一种情况下,您都将适当修改的项目附加到列表中并返回它。

def add_to_list(item, l=None):
    # Note: this doesn't change the item you pass; it just rebinds
    # the local name item to a *new* string if it succeeds.
    try:
        item = item.capitalize()
    except AttributeError:
        pass

    if l is None:
        l = []

    return l + [item]

然后你可以使用

people = add_to_list('kev')  # people == ['Kev']
people = add_to_list('bob')  # people == ['Bob'], Kev is gone!
people = add_to_list('kev', people)  # people == ['Bob', 'Kev'], Kev is back.

第二种方法中提到的更高效的版本进行了l适当的修改但是,在这种情况下,您必须提供一个列表;您无法创建新列表。

def add_to_list(item, l):
    try:
        item = item.capitalize()
    except AttributeError:
        pass

    l.append(item)

people = []  # Create the list in the *calling* scope, not in add_to_list
add_to_list('kev')  # TypeError, missing an argument
add_to_list('kev', people)  # people == ['Kev']
add_to_list('bob', people)  # people == ['Kev', 'Bob']

第一种方法很差;它限制您的函数使用特定列表,该列表的名称在函数中进行了硬编码,但为了完整起见,我将在此处提及它。由于列表是硬编码的,我们将更改函数的名称以反映这一点。

def add_to_people(item):
    global people

    try:
        item = item.capitalize()
    except AttributeError:
        pass

    people.append(item)

现在add_to_list可以使用全局列表people,但不能使用其他列表。

people = []
add_to_people('kev')
add_to_people('bob')

最后,为了充分披露,是的,add_to_people如果尚未创建列表可以创建列表:

def add_to_people(item):
    global people

    try:
        people  # Simply try to evaluate the name
    except NameError:
        people = []

    # ...

但是,如果首先使用全局名称不好,那么像这样自动激活它会更糟。尽可能避免这种编程风格。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

创建一个新文件以在 C 中写入并将其初始化为空?

如何初始化一个类并将对象传递给Android中的构造函数?

如何创建一个空的视图数组,然后将其初始化以在 SwiftUI 中呈现?

Swift/iOS - 如何使用一个范围/函数中的值并将其传递给另一个?

如何在Kotlin中初始化一个空数组列表?

如何在Entity Framework查询中初始化一个空列表?

初始化一个空列表的字典

C:初始化一个结构并将其分配给函数参数中的指针

在函数的参数列表中初始化的变量的范围

创建链接列表而不初始化一个空节点

如何创建一个接受“ Range”对象数组并初始化列表的构造函数,列表初始化为ArrayList

在R中,是否可以在函数内创建一个新对象并将其传递给父环境?

具有成员初始化列表的显式副本构造函数中的空值

如何创建一个用列表初始化的构造函数?

Dart(/ Flutter):在初始化列表中创建函数

空的C ++ 11初始化程序列表导致容器中包含一个默认的构造对象

在python中初始化一个空的csv?

创建一个空列表,在函数中添加指向它的列表,但是在尝试调用它时出错

空向量的构造函数列表初始化

创建一个空列表以在R中填充列表

缓存来自异步函数的结果,并将其传递给Async.js中的下一个函数

将类的实例传递给另一个构造函数,该构造函数将其对象添加到所传递的实例拥有的列表中

Python初始化一个类中的列表

为什么初始化列表会导致2个数据副本,而不仅仅是单个副本将其传递给函数?

在初始化列表中使用空构造函数初始化父类?

在C ++ 17中使用空列表初始化构造函数时发生编译错误

我有一个数组数组并将其传递给scala中的函数,但出现错误

如何构造一个Scala映射并将其作为arg传递给Python解释器中的Scala构造函数?

如何识别一个事件并将其作为参数传递给JS中的回调函数?