2010-01-13 57 views
0

在Perl中,如果我想爲$ myVar賦值$ var1,$ var2或$ var3,根據哪一個的求值爲真,我會編寫以下代碼:根據所存在的值分配多個值中的一個

$myVar = $var1 || $var2 || $var3; 

我工作在Python和PHP單獨的項目,我還沒有想出如何在兩種語言簡潔的代碼這種情況。

在Python中對此進行編碼的最佳方式是什麼?

在PHP中對此進行編碼的最佳方式是什麼?

+1

你真的不應該這樣做蟒蛇。如果你需要名稱存在或不存在,那麼你應該使用dict來代替。 – 2010-01-13 16:57:38

+0

正如其他人指出的那樣,變量在Python中的存在並不能很好地映射到PHP。如果您可以更多地告訴我們「存在」的含義,您將得到更好的Python答案。 – 2010-01-13 17:20:36

+2

在perl中,假設您使用的是現代perl,您應該真的在說'$ myVar = $ var1 // $ var2 // $ var3;'。 – dave4420 2010-01-13 17:21:33

回答

3

Perl'autovivifies'首次引用時的變量(據我所知)。如果變量不存在,Python將引發一個NameError。但是,你可以做這樣的事情。

var1 = var2 = var3 = None 
# code that might change the value of three variables mentioned above 
myvar = var1 or var2 or var3 

一般來說,檢查一個變量是否定義(並根據它來改變控制流)在Python中是一件壞事。你應該使用字典和鍵。

+1

關於Perl,你有錯誤的術語。如果你不使用'strict'編譯指示,變量不需要在使用前聲明(就像PHP一樣)。始終嚴格使用並被視爲最佳做法,並儘可能在最小範圍內根據需要將其關閉。 Autovivification是不同的。這意味着如果你有一個深層次的數據結構(例如一個4維數組),你可以簡單地說'$ array [1] [3] [2] [0] = 5;''而不必做'$ array [1] = []; $陣列[1] [3] = []; $ array [1] [3] [2] = []; $ array [1] [3] [2] [0] = 5;'。所有的中間結構都是自動的。 – daotoad 2010-02-02 16:33:35

+0

感謝您的澄清! :) – 2010-02-02 17:10:26

2

在Python,我相信你可以說

myVar = var1 or var2 or var3 

Python文檔描述x or y作爲

如果x是假的,那麼y,否則x

編輯 :theatrus提出了一個有趣的觀點 - 我甚至沒有考慮到變量可能不是def獨立非執行董事。我發現對此事的討論:

Python沒有一個特定的 功能測試一個變量是否被定義 ,因爲所有的變量都 之前預期 使用已定義的 - 即使最初只是None對象分配了 。試圖訪問 以前未定義的變量會引發異常。

它通常被認爲是不常見的 Python不知道變量 是否已被定義。但是,如果你 是仍然在這種情況下, 你可以嘗試 訪問它一個「嘗試」塊內, 爲其分配確保給定 變量實際上定義(如無, 如果沒有別的) 不應該引發NameError異常。

所以,如果你不能保證變量存在,並且你想一個接一個地檢查存在性和真實性,你可能會遇到一些混亂的代碼。

+1

這僅適用於聲明瞭var1/2/3但可能爲False的情況。如果未聲明var1/2/3,則會導致名稱錯誤。 – 2010-01-13 16:56:43

+0

如果'var1'不存在*,會導致異常。 – badp 2010-01-13 17:01:08

+0

你可以檢查'locals()'和'globals()'字典來查看變量是否被定義,但所有這些都不是Python的方式。 – 2010-01-13 17:48:25

1

在PHP中,您可以使用isset()來測試變量是否已設置,而不是空值。爲了實現你在找什麼,你可以檢查是否$var1$var2$var3設置,然後將值設置爲$myVar

但是這取決於你想設置你$myVar來,這將評估的條件提防true:

$str = ''; 
var_dump(isset($str)); // TRUE 
0

也有conditional expressions在Python在Python 2.5增加:

x = true_value if condition else false_value 

我無法PHP說話。

有一點需要注意的是,試圖評估一個不存在的變量總會引發錯誤。使用Python,你可以解決此通過捕捉將發生NameError異常,如果你這樣做,並回退到默認:

>>> try: 
...  myVar = var1 or var2 or var3 
... except NameError: 
...  myVar = 'default' 
... 
>>> myVar 
'default' 

所以,如果var1var2,或var3可能是沒有設置,那麼myVar將收到「默認」的回退值。否則,您將獲得評估爲True的任何一組var的值。

1

在PHP中,你可以這樣做(假設變量被設置):

$vars = array($var1, $var2, $var3); 
foreach ($vars as $var) { 
    if ($myvar = $var) { 
     break; 
    } 
} 

或者使它稍微佩爾利:):

foreach(array($var1,$var2,$var3)as$var)if($myvar=$var)break; 
相關問題