要在python函数中指定为参数的变量名

时间:2018-03-15 23:48:11

标签: python function parameter-passing

我正在编写一个使用treelib库构建和填充树状数据结构的函数。您可以按如下方式创建树:

foo = Tree()

......从那里开始,这是标准的。这就是我所拥有的,简化:

def make_special_tree(tree, arg1, arg2):
    tree = Tree()
    other_stuff = things(arg1)
    modify_tree(tree, other_stuff, arg2)
    return tree

这就是事情:让我们说我最终想要一个名为blah的树对象。如果我执行以下操作,该命令将运行而不会出现错误:

make_special_tree('blah', foo, bar)

...但是当我之后输入blah时,我会回来NameError: name 'blah' is not defined。如果我执行以下操作,该命令也会运行而不会出现错误:

blah = make_special_tree('yoink', foo, bar)

...当我之后输入blah时,我会回到<treelib.tree.Tree object at 0x10e60db10>,这是我想要看到的。 yoink同时保持未定义,例如前一版本中的blah

因此我的问题 - 我可以说这是基本的,但我无法解决这个问题,部分原因是因为我不确定如何准确地提出这个问题。正如你所看到的,现在我必须创建一个类Tree()的实例,并且我想想我必须为我的函数提供一个参数来执行此操作。我认为blah = make_special_tree(args)是格式化的正确方法,但是如何将变量blah作为我想要返回的树结构的名称传递?

2 个答案:

答案 0 :(得分:0)

函数中的第一个参数是多余的。试试这个:

def make_special_tree(arg1, arg2):
    tree = Tree()
    other_stuff = things(arg1)
    modify_tree(tree, other_stuff, arg2)
    return tree

blah = make_special_tree(foo, bar)

答案 1 :(得分:0)

Python函数通常不会指定变量名称&#34;,它们只返回值,您可以使用这些值执行任何操作。

一个值没有变量名。 * 因为一个值可以存储在五个不同的变量中,或者它可以存储在不是变量的东西中,比如列表的元素。它并不关心。

所以,你几乎肯定想要做的是@spectras在评论中建议的:摆脱第一个参数,然后将值存储在你想要的任何变量中:

def make_special_tree(arg1, arg2):
    tree = Tree()
    other_stuff = things(arg1)
    modify_tree(tree, other_stuff, arg2)
    return tree

# Two different trees with different names
blah = make_special_tree(foo, bar)
yoink = make_special_tree(foo, bar)

# One tree with two names
spam = make_special_tree(foo, bar)
eggs = spam

# A tree with no names at all
cheese = []
cheese.append(make_special_tree(foo, bar))

如果你确实想要创建一个具有指定名称的全局变量,你可以这样做, ** 但这是一个非常糟糕的主意,除非你试图做一些与众不同的事情,比如collections.namedtuple的行为方式就像class一样。

*值可以具有名称,例如具有name属性。您甚至可以更改Tree类的定义,以将name属性用作其输出表示的一部分。但这仍然与你存储的变量无关。

**最简单的方式是globals()[name] = value