2015-07-12 70 views
-2

在控制檯(我認爲是正確的)和函數內(我認爲不正確)之間進行布爾值str比較的方式似乎有所不同。即對於相同的代碼和數據,我得到了不同的答案。 控制檯:控制檯和函數之間的Python str比較不同

s 
Out[537]: ['a', 'g', 'xyz', 'b', '6', 'g', 'v'] 

'x' in s 
Out[538]: False 

'xyz' in s 
Out[539]: True 

所以這都有道理,現在,在函數內我拿S的每個元素反過來,尋找一個真實的回報如下:

def f(s): 
    print 's in f(s) looks like: ', s, 'x' in s 
    return 'x' in s 

結果:

Number of required string in list of strings is: s sent to f(s) is: a 
s in f(s) looks like: a False 
s sent to f(s) is: g 
s in f(s) looks like: g False 
s sent to f(s) is: xyz 
s in f(s) looks like: xyz True 

那麼爲什麼在返回 'XYZ' 真,如果我要找的 'X'?

+0

你可以在'f(s)'中打印's'嗎? – Sait

+0

看來你在第一個例子中有一個列表,而不是一個字符串。最後一個不包含字符串「x」。但顯然,字符串「xyz」包含字符「x」。 –

+0

你的函數檢查''x「'是否在字符串's'中。當你調用'f(「x」)','s'設置爲'「xyz」',所以你在'xyz''中檢查'「x」。字符串'「xyz」'包含字符串'「x」'。 – Sam

回答

2

在控制檯您測試:

'x' in ['a', 'g', 'xyz', 'b', '6', 'g', 'v'] 

在你的程序中,測試

'x' in 'xyz' 

您是不是在比較類似東西等字樣。這兩個表達式在控制檯和程序中都以相同的方式進行評估。


以上如果字符串包含在列表測試的第一比較。第二個測試是否字符串包含在字符串中。

這些是完全不同的東西。在前者中,您需要列表中的一個字符串完全等於'x'。在後者中,檢查是否可以在字符串中找到字母'x'


你沒有顯示你如何調用你的函數,但我們可以推斷你做了什麼。你寫的東西是這樣的:

for str in ['a', 'g', 'xyz']: 
    f(str) 

的混亂似乎發生,因爲你認爲你通過整個列表f(),但你沒有。您重複列表並將每個項目一個接一個地傳遞給f()

我懷疑你的命名沒有幫助。您將您的名單命名爲s。但是,您還將該參數命名爲s。因此函數s內部引用傳遞的參數,一個字符串,但函數s之外引用一個列表。

在你爭論,就好像你的代碼長註釋線索是:

f(['a', 'g', 'xyz']) 

但是,這是不是你寫的代碼。


您應該接受的主要原因是行爲上的差異是由於編碼的不同造成的。您應該學會相信控制檯不會以不同的方式評估表達式。一旦你相信這一點,你將通過查看你的代碼來對這種症狀做出反應,而不是認爲問題在別處。

+0

這是我發送給返回True而不是false的函數的最後一個元素(至少是我期待的方式)。在這個測試中,我正在尋找'x'。所以我發送s [0]這是'a'。它返回False,好;那麼'g',假的好;然後'xyz'。它返回True。不太好。在控制檯上做同樣的事情在'xyz'返回'x'的False – dje

+1

@djee不,不。你會發現'xy'xyz''是'True'。到處。 –

+0

@dje:'xyz''中的''x'在控制檯中返回'True'。我好像你只是想比較兩個值。那麼你應該使用'==',而不是'in'。 –

0

那麼,是不是x在字符串xyz? :)

Python將字符串視爲單字符字符串的可枚舉容器(Python沒有字符類型)。所以根據Python,元素'x'是在容器'xyz'中的

我敢肯定,如果您在提示中評估'x' in 'xyz',它將返回True

+0

我的確嘗試過,如我的問題的第一部分所示。它按預期返回False。 – dje

+0

@dje不,你沒有這樣做。 ''x'in'xyz'== True' –

+0

嗯......不是你沒有。 :)在容器'['a','g','xyz','b','6','g','v']'中搜索了元素「x」,在這種情況下整個字符串「x」需要匹配列表元素之一。 – mooiamaduck

0

您可能調用的方式意味着您傳遞的是字符串而不是使用列表。在你的函數內部也使用了相同的變量s也無濟於事。

讓我們假設你做的兩件事情之一:

  • 在功能

    使用不同的變量名這並沒有掩蓋s額外的好處,並且將返回你所期望的,當你檢查'x' in s

    def f(v): 
        print 's in f(s) looks like: ', s, 'x' in s 
        return 'x' in s 
    

    急性缺點是可變v還是蠻有用的,而且應該可能代替'x'使用。

  • 明確地傳遞列表中,而不是依靠列表的預定義的狀態

    這個也沒有依靠局部/全局變量,是受異想天開變化的好處。

    def f(v, li): 
        print 'li in f(s) looks like: ', li, v in li 
        return v in li