为什么list = [0]仅在第一个输入中返回false?

时间:2018-10-28 07:20:59

标签: python python-3.x

我有这段代码:

name = [0] 
while True :
        # The name needs to be entered twice
        yourname = input("Enter your name: ")
        name.append (yourname)
        if name[-2]:
            print("YOU DID IT")
            break
        else:
            print("REPEAT")

此代码效果很好。但是我还是不明白这段代码:

  1. 为了使第一个输入打印“ REPEAT”,为什么要name = [0]?为什么将代码更改为name = []会显示错误?
  2. 为什么name = [0]在此代码中返回false?

据我了解,if name [-2]将检查name处是否有值,因此如果代码name = []应该返回false并显示“ REPEAT”。

3 个答案:

答案 0 :(得分:0)

  1. 在Python中,为列表提供负整数索引i(在这种情况下为-2)将从末尾返回第i个元素。 当您使用name = [0]初始化列表然后输入名称(例如“德里克”)时,列表现在为name = [0, "Derrick"],表示name[-2] = 0

  2. 当您将列表初始化为name = []时,在首次输入列表后,列表为name = ["Derrick"],而name[-2]不在索引范围内,会返回错误。

  3. if name[-2]不会检查列表中该索引处是否有值。您的代码有效,因为Python认为0False。因此,if name[-2]:if False:相同。

尝试将列表初始化为name = [False]name = [True],这将使事情变得更清楚。

如果要检查列表中的元素数,请使用len(name)。 您可以使用类似的内容:

name = [] 
while True:
    yourname = input("Enter your name twice : ")
    name.append (yourname)
    if len(name) == 2:
        print("YOU DID IT") 
        break
    else:
        print("REPEAT")

答案 1 :(得分:-1)

if name[-2]: 

这将检查列表末尾的第二个元素是否存在。

如果初始化name=[],则在第一次迭代中,列表中将只有一个元素。因此,它将显示列表索引超出范围错误。

答案 2 :(得分:-2)

编写代码的粗略方式。但是看看这是否有助于理解。

最初:

name = [0]
len(name) = 1

第一次迭代

name = [0, "Foo"]
len(name) = 2
name[-2] = 0
if name[-2] => if 0 => False => REPEAT

第二次迭代

name = [0, "Foo", "Foo"]
len(name) = 3
name[-2] = "Foo"       # name[1]
if name[-2] => if "Foo" => True => YOU DID IT => break from the loop