python:如果elif else工作不正确..?

时间:2016-03-13 15:20:57

标签: python-3.x

我有python 3.4.3 如果我使用:

import platform
platform.architecture()

结果是:

('64bit', 'WindowsPE')

我有简单的程序(仅供我使用,仅供测试):

import platform
import time
import os

system_arch = []
windows = "Windows" or "windows"
linux = "Linux" or "linux"

try:
    platform.system()
    a = platform.system()    
    if a == windows:
        platform.architecture()
        if ("64" in os.getenv('PROCESSOR_ARCHITECTURE')) in platform.architecture():
            system_arch += [platform.system()]
            system_arch += ['64-bit']
        elif ("32" in os.getenv('PROCESSOR_ARCHITECTURE')) in platform.architecture():
            system_arch += [platform.system()]
            system_arch += ['32-bit']
        else:
            system_arch += ['win_test_ok']
    elif a == linux:
        system_arch += ['linux_test_ok']

    else:
        system_arch += ['system_error']
except:
    TypeError, AttributeError

print(system_arch)
time.sleep(7)

结果是:

['win_test_ok']

BUT!如果我与'或'重复,我的意思是:

if ("64" in os.getenv('PROCESSOR_ARCHITECTURE')) or ("64" in os.getenv('PROCESSOR_ARCHITECTURE')) in platform.architecture():

elif ("32" in os.getenv('PROCESSOR_ARCHITECTURE')) or ("32" in os.getenv('PROCESSOR_ARCHITECTURE')) in platform.architecture():

工作正常:

['Windows', '64-bit']

我试图在任何地方找到答案但是我翻牌了...... 有任何想法..?

1 个答案:

答案 0 :(得分:2)

你对基本的逻辑运算符有一个根本的误解。 documentation表示x or y语句被评估为“如果x为假,则为y,否则为x”。在您的代码中的这些语句的上下文中考虑一下:

windows = "Windows" or "windows"
linux = "Linux" or "linux"

对于每一个,它将查看or之前的字符串。由于它不是空字符串,因此评估为True,因此"Windows" or "windows"的评估结果为"Windows"。因此,这两个陈述与:

相同
windows = "Windows"
linux = "Linux"

碰巧,你很幸运,platform.system()返回"Windows",你进入了外if语句的正确分支。现在出现下一个问题:

if ("64" in os.getenv('PROCESSOR_ARCHITECTURE')) in platform.architecture():

我不确定你认为这是如何工作的,但是"64" in os.getenv('PROCESSOR_ARCHITECTURE')只会评估为True(在64位环境中),因此该行将等同于:< / p>

if True in platform.architecture():

...这不会成功,因为字符串中没有True个对象。

您的“重复”行按预期工作的原因:

if ("64" in os.getenv('PROCESSOR_ARCHITECTURE')) or ("64" in os.getenv('PROCESSOR_ARCHITECTURE')) in platform.architecture():

...是因为,正如我所提到的,"64" in os.getenv('PROCESSOR_ARCHITECTURE')评估为True。由于这使得or之前的部分成为真,所以程序会得到满足并进入if块而不必费心去查看后面的内容。

那么你如何解决它?

如果要判断字符串是否与多个字符串中的一个匹配,可以使用列表或元组in

windows = ("Windows", "windows")

...

if a in windows:

至于另一个,我不完全确定你真正要做的是什么,但删除第二个in条款似乎做了你想要的事情:

if "64" in os.getenv('PROCESSOR_ARCHITECTURE'):