【问题标题】:Variable name to be assigned as argument in a python function在 python 函数中作为参数分配的变量名
【发布时间】:2018-03-15 23:48:11
【问题描述】:

我正在编写一个使用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 作为我想要返回的树结构的名称传递?

【问题讨论】:

  • 您正在函数中创建 Tree 对象。所以不要将它传递给它,只需删除第一个参数。然后blah = make_special_tree(foo, bar) 就可以了。
  • 值没有名字。你可以有多个变量都引用同一个值——或者甚至不是变量的东西,比如列表的各个元素。当然,你可以给一个值一个name 属性,或者任何你想要的,但这与你要存储它的变量(如果有的话)无关。

标签: python function parameter-passing


【解决方案1】:

Python 函数通常不会“分配变量名”,它们只是返回值,您可以对这些值做任何您想做的事情。

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

所以,你几乎肯定想做的是@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

【讨论】:

  • 绝对不想创建全局变量。 (恐怖,恐怖!)回想起来,解决方案确实是删除第一个参数。感谢您的快速回复。
  • @JPFerguson 很多人没有意识到这一点,但是 make_special_tree 函数是一个全局变量,就像您导入的任何模块一样,以及您在模块级分配结果的 blah代码等等。 “不要使用全局变量”作为教条在 Python 中的工作方式与在其他语言中的工作方式不同。当你违反它的精神时,通常很明显,但试图提出一个真正适用于它的文字的规则,那就是另一回事了……
【解决方案2】:

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

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)

【讨论】:

  • 是的,这是我犯的基本错误。以交互方式玩弄这个库,然后尝试将东西包装到一个函数中。感谢您的快速回复。
猜你喜欢
  • 2018-03-25
  • 1970-01-01
  • 2014-01-19
  • 2014-12-28
  • 2021-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多