2011-05-28 121 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的 ..在一個不錯的列表中。這有幫助嗎?