2011-05-28 118 views
2

---- Complete Rephrasing ----Python中的shell样式列表生成或变量表达式?

我正在研究一个新的类,其中每个实例基本上是连续的和链接的。我以一种非常shell脚本的方式思考过,如果我系统地命名它们,我可以定义一个函数来编译所有这些实例的列表。然后,我可以做我想要的东西,它以某种方式浏览序列。

但我看到这是一个可怕的方法。据我现在了解,我应该做以下其中一项:

  • 在类中包含嵌入式引用,从而创建递归数据结构。
  • 创建所有实例的列表,这些实例可能在类init中更新,或者在创建新实例时更新。
  • 忘记首先定义一个新类并使用其他对象的列表。

我希望我已经明白了。再次感谢你提供的建议。

-----原来的,但编辑广义的问题-----

你好,

我是比较新的Python和我发现自己一直想生成的现有对象的列表某种。说我有一个名为X#三个变量,其中#是一个数字从1至3之类的代码,我觉得想写会是这样的:

n=1 
List_Of_X=[] 
while n < 4: 
    List_Of_X.append("x%s" % (n)) 
    n += 1 

但然后当然我结束了一个字符串列表而不是变量。那么,有什么方法可以“表达”与字符串相对应的变量吗?或者更好的是,首先创建一个变量列表?

编辑:关键是没有手动指定列表 - 我想以某种方式自动化。从下面的答案看来,我可以使用我上面公认的方法生成一个字符串列表,然后使用eval()函数来表达它们。或者,首先使用一种生成对象列表的复杂方法。

我觉得这两种解决方案都不是最佳实践,但我非常感谢所有帮助!谢谢。

+1

为什么你首先有名为'x1','x2'等的变量?只需使用一个列表。 – Eevee 2011-05-28 05:00:39

+1

你真的想做什么 – ninjagecko 2011-05-28 06:26:13

+0

这个神秘的东西在评论中被接受的答案解决了。 – Eevee 2011-05-28 06:42:32

回答

-2

我想你首先需要明白, Python中没有变量。只有对象的引用。所以即使考虑“创造变数”也是一个错误。他们不存在。

+0

有趣的评论,我从来没有听说过这个。 – ThomasH 2011-05-28 09:42:22

+1

“Python中没有变量”是迂腐和混乱的。 – 2012-12-08 23:30:53

+0

这是完全错误的。有任何定义的变量(除了排除可变变量之外的变量)。 – Marcin 2013-05-01 17:56:16

1

事情是这样的:

list_of_x = [x1, x2, x3] 
+0

对不起,我对此有点不清楚。我想避免明确指定列表 - 感谢您的建议。 – Kyle 2011-05-28 05:29:16

1

如果你有这样的代码:

x1 = "foo" 
x2 = "bar" 
x3 = "goat" 

,那么你应该将其替换为:

x = ["foo", "bar", "goat"] 

你可以这样做:

x = [x1, x2, x3] 

但是,这会将x1,x2,x3的值复制到x中。对x所做的更改不会更改x1,x2,x3。

如果此策略对您不适用,您需要向我们展示更多您正在做的事情,以便我们可以帮助您。

+0

啊,更多的证据表明我应该更加明确地表示我想避免手动输入'x'列表!但感谢您的答案。 – Kyle 2011-05-28 05:30:29

0

您可以使用vars()locals(),或globals()创建新的变量,但需要做的,这是非常不寻常的:

for n in range(1, 4): 
    vars()['x%s' % n] = n 

>>> x1, x2, x3 
<<< (1, 2, 3) 
+0

啊,我明白了 - 首先我听说过变量函数,我没有意识到局部变量或全局函数会以这种方式运行。谢谢,在这个方法和杰夫陈的答案之间,我可以从两个不同的方向看到我的问题的解决方案。 – Kyle 2011-05-28 05:27:30

+1

@Kyle:**错误的方式返回** ...告诉我们*清楚地告诉我们您的**真实**问题是什么...... vars()和eval()会导致比他们解决更多的问题! – 2011-05-28 05:52:44

-3

您可以通过使用eval其值的变量转换(VAR)

例如,在你的情况,你可以这样做:

map(eval,List_Of_X) 

如果你想转换您STRI列表如果x1 = 1且x2 = 2,ngs ['x1','x2',...]转换成它们的值,比如说[1,2,...]

+0

完美 - 只是我正在寻找的功能 - 谢谢。 – Kyle 2011-05-28 05:26:02

+3

Pleae不这样做。对于任何问题,“eval”几乎都不是正确的答案,除此之外,它是危险的。如果没有别的,使用'globals()'和朋友。理想情况下,只是不要首先使用这些名称创建变量。 – Eevee 2011-05-28 05:30:59

+1

@Kyle你需要的是一个更好的数据结构,而不是'eval'黑客。 – FMc 2011-05-28 05:31:00

0

好吧,所以当它们出现时,这个神秘的一部分似乎会捕获变量x1,x2 ......。如果你设法做到这一点,应该很容易将它们收集在一个列表中,对吧?!所以你必须寻找你真正为它们赋值的地方,x1 = ...,x2 = ... ...

也许你正在从文件或用户输入中读取这些值? - 让我们详细说明Eevee在评论中提到的一个案例,其中x1,x2,...实际上是用户定义的类的实例。然后,而不是你的XN之一的分配之后手动追加到一个列表,你可以让类做记录为您提供:

class C(object): 
    instances = [] 
    def __init__(self): 
     C.instances.append(self) 

x1=C() 
x2=C() 
x3=C() 

C.instances # <= [<__main__.C object at 0x01293230>, ...] 

所以你拍摄的值X1,X2的 ..在一个不错的列表中。这有帮助吗?