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

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条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

C ++在类中初始化一个空列表

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

如何在列表中设置匹配项,将其设置为变量,重新格式化输出并将其传递给另一个脚本?

来自分类Dev

Java-试图使用在另一个类中传递给另一个构造函数的参数来初始化对象?

来自分类Dev

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

来自分类Dev

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

来自分类Dev

测试一个空列表的函数

来自分类Dev

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

来自分类Dev

Java初始化整数并将其添加到一行中的列表中

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

与以下代码段相关的问题,初始化一个空列表并追加

来自分类Dev

线程化一个类成员函数;通过初始化列表进行线程初始化

来自分类Dev

def函数中的空列表(列表索引超出范围)

来自分类Dev

在python中创建一个空的嵌套列表

来自分类Dev

检查初始化程序列表中的空向量

来自分类Dev

初始化列表中的空括号魔术

来自分类Dev

检查初始化程序列表中的空向量

来自分类Dev

如何在构造函数的成员初始化器列表中调用两个函数?

来自分类Dev

将结构按值传递给另一个函数会将其初始化为零

Related 相关文章

  1. 1

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

  2. 2

    C ++在类中初始化一个空列表

  3. 3

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

  4. 4

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

  5. 5

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

  6. 6

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

  7. 7

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

  8. 8

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

  9. 9

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

  10. 10

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

  11. 11

    如何在列表中设置匹配项,将其设置为变量,重新格式化输出并将其传递给另一个脚本?

  12. 12

    Java-试图使用在另一个类中传递给另一个构造函数的参数来初始化对象?

  13. 13

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

  14. 14

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

  15. 15

    测试一个空列表的函数

  16. 16

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

  17. 17

    Java初始化整数并将其添加到一行中的列表中

  18. 18

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

  19. 19

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

  20. 20

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

  21. 21

    与以下代码段相关的问题,初始化一个空列表并追加

  22. 22

    线程化一个类成员函数;通过初始化列表进行线程初始化

  23. 23

    def函数中的空列表(列表索引超出范围)

  24. 24

    在python中创建一个空的嵌套列表

  25. 25

    检查初始化程序列表中的空向量

  26. 26

    初始化列表中的空括号魔术

  27. 27

    检查初始化程序列表中的空向量

  28. 28

    如何在构造函数的成员初始化器列表中调用两个函数?

  29. 29

    将结构按值传递给另一个函数会将其初始化为零

热门标签

归档