2009-02-01 47 views
1

我感觉这可能是我应该知道的东西,但我现在无法想到它。我想获得一个函数来建立一个列表,其中列表的名称是函数中给出的参数;在python中用函数参数命名的列表

例如

def make_hand(deck, handname): 
    handname = [] 
    for c in range(5): 
     handname.append(deck.pop()) 
    return handname 

    # deck being a list containing all the cards in a deck of cards earlier 

的问题是,这将创建一个名为handname时,我希望它被称为创造的手时,任何用户输入的handname列表。

任何人都可以帮忙吗?谢谢

+0

我不太确定这是个好主意。 :)尝试使用字典来代替。 – 2009-02-01 16:00:59

回答

6

您可以保留一个字典,其中的键是手的名称,值是列表。

然后你可以只说字典[手机]来访问一个特定的手。沿着线:

hands = {} # Create a new dictionary to hold the hands. 
hands["flush"] = make_hand(deck) # Generate some hands using your function. 
hands["straight"] = make_hand(deck) # Generate another hand with a different name. 
print hands["flush"] # Access the hand later. 
+0

不错的主意,谢谢 – user33061 2009-02-01 16:00:09

2

虽然你可以在运行时创建任意名称的变量,使用exec(如SYKORA建议),或通过与locals,在对象上globalssetattr meddlings,你的问题是有点无实际意义。

一个对象(几乎任何东西,从整数到有1000个成员的类)都只是一块内存。它不具有名称,它可以具有任意多个名称,并且所有名称都被视为相同:它们只引入对某个对象的引用并阻止其被收集。

如果你想命名项目的意思是你的程序的用户给一个对象提供了一个用户可见的名字,你应该使用一个字典来关联具有名字的对象。

您对用户提供的变量名称的方法有其他几个严重含义: *如果用户提供现有变量的名称会怎么样? *如果用户提供无效名称会怎么样?

您正在介绍leaky abstraction,所以除非程序的目的真的非常重要,用户可以指定一个新的变量名称,否则用户不必担心如何存储对象 - 一个不会出现看似奇怪的限制。